Сбой функционального теста для 'create' с использованием should_redirect_to

У меня проблема с попыткой использовать «shoulda» с «factory_girl» для создания функционального теста для «create» в приложении Rails. Я создал простой проект, пользователь с шаблоном, добавил «shoulda» (текущая версия гема в моей системе 2.11.3) и «factory_girl» в test_helper.rb. Создание пользователя вручную отлично работает. Ниже приведены шаги по воспроизведению сбоя:

  1. проект рельсов
  2. имя пользователя скаффолда: строка
  3. # P2 #
      require 'shoulda'  
      require 'factory_girl'
    
  4. rake db: migrate

  5. напишите следующий функциональный тест для пользователя (переопределите users_controller_test.rb):

    class UsersControllerTest < ActionController::TestCase
     Factory.define(:user) do |u|
      u.name 'joe'
     end
     context "should create user" do
      context "with valid data" do
       setup do
         User.any_instance.expects(:save).returns(true).once
         User.any_instance.stubs(:id).returns(1001)
         post :create, :user => {}
       end
       should_assign_to :user, :class => User
       should_set_the_flash_to "User was successfully created."
       should_redirect_to("user page"){user_path(1001)}
      end
     end
    end
    
  6. Выполнение теста с "rake test: functionals" показывает ошибку:

Ожидаемый ответ - перенаправление на <http://test.host/users/1001>, но было перенаправление на <http://test.host/users>.

Я также играл с «should_redirect_to», потому что я видел, что «should_redirect_to» устарело, но безуспешно. У тебя есть идеи ?

Заранее спасибо,

Мариан Василий Карайман.


person Marian Vasile Caraiman    schedule 10.11.2010    source источник
comment
Подтвердили ли вы, что при создании пользователя вручную происходит правильное перенаправление?   -  person David Lyod    schedule 10.11.2010
comment
Он отлично работает при создании пользователя вручную. Кроме того, остальные 2 утверждения в порядке.   -  person Marian Vasile Caraiman    schedule 11.11.2010


Ответы (1)


Вместо того, чтобы заглушать User#id, заглушить User.create и использовать определенный пользовательский объект-имитатор.

setup do
  mock_user = Factory.stub(:user, :id => 1001)
  User.expects(:create).returns(mock_user)
  mock_user.expects(:save).returns(true)
  post :create, :user => {}
end
person Max Chernyak    schedule 11.11.2010