Rspec Mocking: ActiveRecord :: AssociationTypeMismatch - PullRequest
7 голосов
/ 03 февраля 2011

Я новичок в Rspec и пытаюсь настроить тест для профиля пользователя. Профиль принадлежит пользователю.

Теперь у меня есть интеграция API со сторонним сайтом, который работает через пользовательскую модель, но некоторая информация для этой ссылки API содержится в Profile, поэтому у меня есть фильтр after_update для Profile, который сообщает родительскому элементу пользователь, чтобы сохранить, который вызывает обновление API.

Я пытаюсь написать тест для этого и получаю ActiveRecord :: AssociationTypeMismatch. Причина в том, что я использую фиктивного пользователя, но пытаюсь проверить, что при обновлении профиля он отправляет: сохранить пользователю. Кроме того, в модели User есть процесс подтверждения по электронной почте и предоставляемые API-вызовы в процессе создания, поэтому на самом деле не идеально создавать пользователя просто для проверки этого.

Вот мой тест:

it "should save the parent user object after it is saved" do
    user = double('user', :save => true )
    profile = Profile.create( :first_name => 'John', :last_name => 'Doe' )
    profile.user = user

    user.should_receive(:save)
end

Итак, очевидно, что ошибка ActiveRecord вызывается попыткой связать фиктивного пользователя с профилем, который ожидает, что реальный пользователь будет связан.

Мой вопрос: как избежать подобных проблем при написании тестов на рельсах? Все, что я хочу сделать в этом тесте, это убедиться, что профиль вызывает: сохранить в родительском пользователе. Есть ли более разумный способ сделать это или способ обойти ошибку ActiveRecord?

Спасибо!

Ответы [ 2 ]

11 голосов
/ 06 февраля 2011

Вы должны иметь возможность использовать mock_model для этого:

it "should save the parent user object after it is saved" do
  user = mock_model(User)
  user.should_receive(:save).and_return(true)
  profile = Profile.create( :first_name => 'John', :last_name => 'Doe' )
  profile.user = user
end
4 голосов
/ 09 февраля 2011

Я нашел единственный способ обойти эту проблему - использовать фабричного пользователя вместо насмешки.Это разочаровывает, но при тестировании обратных вызовов между двумя моделями ActiveRecord необходимо использовать реальные модели, иначе вызовы сохранения не будут выполнены, жизненный цикл не произойдет и обратные вызовы не могут быть протестированы.

...