RSPEC - Rails - Как следовать перенаправлению
-
30-09-2019 - |
Вопрос
Кто-нибудь знает, как сделать RSPEC следовать перенаправлению (в спецификации контроллера)? (например, тест / блок имеет следующее /redirect!)
Я пробовал "Shick_redirect!" и «следовать_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
Но следуйте_redirect! должен быть изменен на что-то, что на самом деле работает.
Решение
Если вы хотите проверить перенаправить, вы двигаетесь за пределы домена RSPEC-Rails.
Вы можете использовать Webraat или какую-либо другую интеграционно-тестовую структуру для проверки этого.
Самый простой способ решить это, не прибегая к интеграционному тестированию, вероятно, нужно поднимать метод, который вызывает перенаправление.
Другие советы
Я думаю, что это поведение по умолчанию для rspec-рельсы Тесты контроля в том смысле, что вы можете установить ожидание в состоянии ответа и / или пути, и тестировать на успех.
Например:
it "should create an account" do
post :create
response.code.should == "302"
response.should redirect_to(accounts_path)
end
Вы можете получить доступ к месту перенаправления с
response.headers['Location']
Затем вы можете запросить это напрямую.
Попробуйте использовать тесты интеграции / запроса. Они используют веб-магазины 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 теста: создание и шоу на результате создания.
Спецификация не имеет возможности не имеет возможности, если вы хотите выполнить спецификацию запроса на использование перенаправления, эквивалент теста в интеграции в тесте :: блок.
В запросе спецификации follow_redirect!
Работает, а также в тесте :: блок.
Или если вы хотите перенаправить неизменно использовать _via_redirect
Как суффикс для глагола, пример:
post_via_redirect :create, user: @user
Для RSPEC / Capybara + Rails
response_headers['Location']
Но это работает только в том случае, если нет задержки до перенаправления. Если это там, то сложнее следовать в логике.