Rspec - Rails - как следовать перенаправлению
Кто-нибудь знает, как заставить rspec следовать перенаправлению (в спецификации контроллера)? (например, test/unit имеет следующий_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! необходимо изменить на то, что действительно работает.
Ответы
Ответ 1
Если вы хотите протестировать перенаправление, вы перемещаетесь за пределы домена rspec-rails.
Вы можете использовать Webrat или другую среду интеграции-тестирования, чтобы проверить это.
Самый простой способ решить это, не прибегая к интеграционным тестированию, - это, вероятно, издеваться над методом, вызывающим перенаправление.
Ответ 2
Я думаю, что это поведение по умолчанию для тестов rspec-rails в том смысле, что вы можете установить ожидаемое состояние ответа и/или путь и проверить успех.
Например:
it "should create an account" do
post :create
response.code.should == "302"
response.should redirect_to(accounts_path)
end
Ответ 3
Вы можете получить доступ к местоположению перенаправления с помощью
response.headers['Location']
вы можете запросить это напрямую.
Ответ 4
Попробуйте использовать тесты интеграции/запроса. Они используют сетевые acces через маршрутизацию к контроллерам.
Например:
У меня есть приложение 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 теста: создание и показ по результату создания.
Ответ 5
Спецификация выходит за пределы области видимости, если вы хотите следовать спецификации запроса на перенаправление, эквивалент теста интеграции в Test:: Unit.
В спецификациях запросов follow_redirect!
работает так же, как и в Test:: Unit.
Или, если вы хотите перенаправить сразу, используйте _via_redirect
как суффикс для глагола, например:
post_via_redirect :create, user: @user
Ответ 6
Для RSpec/Capybara + Rails
response_headers['Location']
Но он работает только в том случае, если перед перенаправлением нет задержки.
Если он есть, то сложнее следовать логике.