'redirect_to root_path' не отображается как перенаправление в тесте интеграции RSpec - PullRequest
2 голосов
/ 19 августа 2011

У меня есть приложение 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 ==)

Ответы [ 2 ]

0 голосов
/ 28 августа 2011

Я думаю, что решил проблему. Изменение кода подтверждения на

it "should redirect to root" do
  current_url.should == root_url("en")
end

работает.

Я предполагаю, что причина моей проблемы в том, что webrat фактически следует за перенаправлением, поэтому в моем исходном тесте я проверял код ответа второго ответа после перенаправления.

0 голосов
/ 23 августа 2011

Я знаю, что это может показаться глупым, но попробуйте поместить первый root: to => "pages # home" "внизу файла маршрутов.Вы также можете попробовать:

scope "/:locale", :as => "localized" do
  root :to => "pages#home"
  ...
  match "/sign_in" => "sessions#new"
  resources :sessions, :only => [:new, :create]
end
root :to => "pages#home"

Затем в своем тесте вы будете проверять перенаправление на localized_root_path.

Я могу быть сумасшедшим, но я думаю, что это может быть конфликт имени сназванный маршрут.Если вы проверите rake routes, вы, вероятно, обнаружите, что у вас есть два названных маршрута с именем root.Поскольку маршруты «первого соответствия», вы можете просто выбрать неправильный маршрут в своем тесте.

...