Rspec-Rails - как следить за перенаправлением

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

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

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 ответов


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

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

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


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

например:

it "should create an account" do
  post :create
  response.code.should == "302"
  response.should redirect_to(accounts_path)
end

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

response.headers['Location']

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


попробуйте использовать тесты интеграции / запроса. Они используют web-подобные доступы через маршрутизацию к контроллерам. Например: У меня для 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 теста: создание и показать результат создания.


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

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

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

post_via_redirect :create, user: @user

Для RSpec / Capybara + Rails

response_headers['Location']

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