Rspec - Rails - Как выполнить редирект - PullRequest
40 голосов
/ 19 мая 2010

Кто-нибудь знает, как заставить rspec следовать перенаправлению (в спецификации контроллера)? (например, тест / юнит имеет follow_redirect!)

Я пробовал "follow_redirect!" и "follow_redirect", но только получить

undefined method `follow_redirect!' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1:0xb6df5294>

Например:
Когда я создаю учетную запись, страница перенаправляется на страницу учетных записей, и моя новая учетная запись должна быть вверху списка.

it "should create an account" do
  post :create, :name => "My New Account"
  FOLLOW_REDIRECT!
  response.code.should == "200"
  accounts = assigns[:accounts]
  accounts[0].name.should == "My New Account"
end

Но FOLLOW_REDIRECT! нужно заменить на что-то, что действительно работает.

Ответы [ 6 ]

65 голосов
/ 20 мая 2010

Я думаю, что это поведение по умолчанию для rspec-rails тестов контроллера, в том смысле, что вы можете установить ожидание для статуса ответа и / или пути и проверить на успешность.

Например:

it "should create an account" do
  post :create
  response.code.should == "302"
  response.should redirect_to(accounts_path)
end
27 голосов
/ 26 сентября 2012

Вы можете получить доступ к месту перенаправления с помощью

response.headers['Location']

Вы можете запросить это напрямую.

19 голосов
/ 20 мая 2010

Если вы хотите проверить перенаправление, которое вы перемещаете за пределы домена rspec-rails.

Вы можете использовать Webrat или какую-либо другую инфраструктуру для тестирования интеграции.

Самый простойЧтобы решить эту проблему, не прибегая к интеграционному тестированию, возможно, смоделируйте метод, который вызывает перенаправление.

2 голосов
/ 18 июня 2015

Спецификация выходит за рамки, если вы хотите следовать спецификации запроса на перенаправление, эквивалентный интеграционному тесту в Test :: Unit.

В спецификации запроса follow_redirect! работает так же, как и в Test :: Unit.

Или, если вы хотите немедленно перенаправить, используйте _via_redirect в качестве суффикса для глагола, например:

post_via_redirect :create, user: @user
2 голосов
/ 17 апреля 2013

Попробуйте использовать тесты интеграции / запроса. Они используют веб-доступ через маршрутизацию к контроллерам. Например: У меня есть приложение Rails 2 в файле /spec/integration/fps_spec.rb

 require 'spec_helper'

 describe "FinPoradci" do 

   it "POST /fps.html with params" do
     fp_params={:accord_id => "FP99998", :under_acc => "OM001", :first_name => "Pavel", :last_name => "Novy"}
     fp_test=FinPoradce.new(fp_params)
     #after create follow redirection to show
     post_via_redirect "/fps", {:fp => fp_params}
     response.response_code.should == 200 # => :found ,  not 302 :created
     new_fp=assigns(:fp)
     new_fp.should_not be_empty
     new_fp.errors.should be_empty
     flash[:error].should be_empty
     flash[:notice].should_not be_empty
     response.should render_template(:show)
   end
 end

и это работает. Пока вы не хотите отправлять заголовки (для базовой http-авторизации).

 env={'HTTP_AUTHORIZATION' => ActionController::HttpAuthentication::Basic.encode_credentials(user,password)}
 post_via_redirect "/fps", {:fp => fp_params}, env

подходит для создания, но после перенаправления возвращает 401 и требует новой авторизации. Так что я должен разделить его на 2 теста: создание и показать по результату создания.

0 голосов
/ 21 февраля 2013

Для RSpec / Capybara + Rails

response_headers['Location']

Но это работает, только если нет задержки перед перенаправлением. Если оно есть, тогда сложнее следовать логике.

...