Рассмотрим две модели:FactoryGirl Как создать экземпляр, который создается объединением на обратный вызов
class User < ActiveRecord::Base
has_one :book
after_create :create_book
end
class Book < ActiveRecord::Base
belongs_to :user
validate_uniqueness :user_id
end
Каждый пользователь может иметь и может иметь только одну книгу. Потом я два завода определен в моей спецификации:
factory :user do
end
factory book do
user
end
Тогда вот вопрос, когда я пишу тест для Book
, я хотел бы создать запись book1
(назовем его) для Book
, когда я использую FactoryGirl.create(:book)
. Он создаст экземпляр Book
, а затем попытается создать ассоциацию, определенную user
. После создания пользователя after_create
является триггером, а book2
создан для user
. Затем он пытается связать book1
с user
и блокирован ассоциацией единства.
Теперь я использую book = FactoryGirl.create(:user).book
. Это лучший/правильный способ сделать это? Я думаю, что это так интуитивно понятно, поскольку я тестирую Book
, я думаю, было бы лучше всего иметь book = FactoryGirl.create(:book)
Большое спасибо.
Отличная идея. Но я получил 'undefined метод' and_return 'для # (NoMethodError) 'пробует ваши образцы, я не знаю почему. Но я обойду с помощью 'after (: build) {| user | user.class.skip_callback (: create,: after,: create_book_for_user)} ' –
larryzhao
Вы включаете' include RSpec :: Mocks :: ExampleMethods' в rails_helper.rb –
Да, извините, я пропустил это сначала. Я просто пытаюсь это сделать, с 'include RSpec :: Mocks :: ExmpleMethods' в моем' rails_helper.rb'. Я все еще получаю 'NoMethodError: undefined method' allow 'для # ' –
larryzhao