У меня есть приложение rails со следующими маршрутами
root :to => "pages#home"
scope "/:locale" do
root :to => "pages#home"
...
match "/sign_in" => "sessions#new"
resources :sessions, :only => [:new, :create]
end
Мой ApplicationController содержит default_url_options (), который автоматически устанавливает опцию языкового стандарта
Мой SessionsController содержит следующее
class SessionsController < ApplicationController
def new
end
def create
redirect_to root_path
end
end
Так что там пока нет никакой логики, только перенаправление. Когда я запускаю приложение в браузере, перехожу на страницу входа, отправляю форму (которая публикует в / en / сеансы), затем она работает как положено: я перенаправлен на / en
Однако интеграционный тест не может распознать перенаправление
describe "sign-in" do
before(:each) do
visit "/en/sign_in"
@user = Factory.create(:user)
end
context "with valid attributes" do
before(:each) do
fill_in "email", :with => @user.email
fill_in "password", :with => @user.password
end
it "should redirect to root" do
click_button "Sign in"
response.should be_redirect
response.should redirect_to "/en"
end
end
end
Тест не пройден с сообщением
5) Authentication sign-in with valid attributes should redirect to root
Failure/Error: response.should be_redirect
expected redirect? to return true, got false
Таким образом, даже если приложение перенаправляет правильно, RSpec не видит ответ как перенаправление.
Если я, просто для удовольствия, поменяю реализацию create на
def create
redirect_to new_user_path
end
Тогда я получаю сообщение об ошибке
6) SessionsController POST 'create' with valid user should redirect to root
Failure/Error: response.should redirect_to root_path
Expected response to be a redirect to <http://test.host/en> but was a redirect to <http://test.host/en/users/new>
Что, конечно, является ожидаемым сообщением об ошибке, поскольку функция теперь перенаправляет на неправильный URL-адрес. Но почему new_user_path приводит к перенаправлению, которое RSpec видит как перенаправление, а root_path приводит к перенаправлению, которое RSpec не распознает как перенаправление?
Обновление
На основании комментариев я изменил тест, чтобы проверить код состояния
it "should redirect to root" do
click_button "Sign in"
response.status.should == 302
response.should be_redirect
response.should redirect_to "/en"
end
Это приводит к ошибке
5) Authentication sign-in with valid attributes should redirect to root
Failure/Error: response.status.should == 302
expected: 302
got: 200 (using ==)