Подтвердить что ты не робот

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! необходимо изменить на то, что действительно работает.

4b9b3361

Ответ 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']

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