Проверка Rspec redirect_to: назад
Как вы тестируете redirect_to :back
в rspec?
Я получаю
ActionController::RedirectBackError
:
В запросе этого действия не было задано HTTP_REFERER
, поэтому redirect_to :back
нельзя было назвать успешно. Если это тест, обязательно укажите request.env["HTTP_REFERER"]
.
Как мне настроить HTTP_REFERER
в моем тесте?
Ответы
Ответ 1
Используя RSpec, вы можете установить референт в блок before
. Когда я попытался установить референт непосредственно в тесте, он, похоже, не работал независимо от того, где я его разместил, но перед блоком это трюк.
describe BackController < ApplicationController do
before(:each) do
request.env["HTTP_REFERER"] = "where_i_came_from"
end
describe "GET /goback" do
it "redirects back to the referring page" do
get 'goback'
response.should redirect_to "where_i_came_from"
end
end
end
Ответ 2
Из направляющих rails при запросе запроса с новым стилем запроса:
describe BackController < ApplicationController do
describe "GET /goback" do
it "redirects back to the referring page" do
get :show,
params: { id: 12 },
headers: { "HTTP_REFERER" => "http://example.com/home" }
expect(response).to redirect_to("http://example.com/home")
end
end
end
Ответ 3
Что касается тестирования: обратные ссылки в тестах интеграции, я сначала нахожусь на мертвой странице, что, я думаю, вряд ли когда-либо будет использоваться в качестве ссылки, а затем на странице, которую я тестирую. Таким образом, мой код выглядит следующим образом
before(:each) do
visit deadend_path
visit testpage_path
end
it "testpage Page should have a Back button going :back" do
response.should have_selector("a",:href => deadend_path,
:content => "Back")
end
Однако у этого есть недостаток, который, если ссылка действительно относится к deadend_path, тогда тест будет ошибочно пройден.
Ответ 4
ИМХО принятый ответ немного взломан. Лучшей альтернативой было бы установить HTTP_REFERER
на фактический URL-адрес в вашем приложении, а затем ожидать перенаправления обратно:
describe BackController, type: :controller do
before(:each) do
request.env['HTTP_REFERER'] = root_url
end
it 'redirects back' do
get :whatever
response.should redirect_to :back
end
end
- Перенаправление на случайную строчную константу кажется, что она работает случайно
- Вы используете встроенную функцию rspec, чтобы точно выразить то, что вы хотели.
- Вы не вводите и не повторяете значения магической строки
Для более новых версий rspec вы можете вместо этого использовать ожидания:
expect(response).to redirect_to :back
Ответ 5
Если кто-то наткнется на это, и они используют спецификации request
, вам нужно явно указать заголовки в запросе, который вы делаете. Формат тестового запроса зависит от того, какую версию RSpec вы используете, и если вы можете использовать аргументы ключевых слов вместо позиционных аргументов.
let(:headers){ { "HTTP_REFERER" => "/widgets" } }
it "redirects back to widgets" do
post "/widgets", params: {}, headers: headers # keyword (better)
post "/widgets", {}, headers # positional
expect(response).to redirect_to(widgets_path)
end
https://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec
Ответ 6
request.env['HTTP_REFERER'] = '/your_referring_url'