Вопрос

Кто-нибудь знает, как сделать 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']

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top