RSpec тестирование перенаправление:назад
как вы проверяете redirect_to :back в rspec?
Я
ActionController::RedirectBackError:
НетHTTP_REFERERбыл установлен в запросе к этому действию, так чтоredirect_to :backне удалось успешно вызвать. Если это тест, обязательно укажитеrequest.env["HTTP_REFERER"].
как мне установить HTTP_REFERER в моем тесте?
6 ответов:
используя RSpec, вы можете установить реферер в
beforeблок. Когда я попытался установить реферер непосредственно в тесте, он, казалось, не работал независимо от того, где я его поставил, но блок 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
Если кто-то натыкается на это, и они используют
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) endhttps://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec
С направляющие при запросе запроса с новым стилем запроса:
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
что касается тестирования :обратные ссылки в интеграционных тестах, я сначала посещаю тупиковую страницу, которая, как я думаю, вряд ли когда-либо будет использоваться в качестве ссылки, а затем страницу, которую я тестирую. Так что мой код выглядит так
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, то тест будет неправильно проходить.
ИМХО принятый ответ немного хаки. Лучшей альтернативой было бы установить
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
Comments