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']
но это работает только если нет задержки перед переадресацией. Если она есть, то логике следовать сложнее.