Какая разница между методами сборки и создания в FactoryGirl?

Ввод Factory Girl определяет разницу между FactoryGirl.build() и FactoryGirl.create():

# Returns a User instance that not saved
user = FactoryGirl.build(:user)

# Returns a saved User instance
user = FactoryGirl.create(:user)

Я до сих пор не понимаю практических различий между ними. Может ли кто-нибудь дать пример, где вы хотели бы использовать один, а не другой? Спасибо!

Ответ 1

Метод create() сохраняет экземпляр модели, в то время как метод build() сохраняет его только в памяти.

Лично я использую метод create() только тогда, когда настойчивость действительно необходима, так как запись в БД делает тестирование временем.

например.

Я создаю пользователей для аутентификации с помощью create(), потому что мой механизм проверки подлинности запрашивает DB.

Чтобы проверить, имеет ли модель атрибут метод build(), потому что не требуется доступ к БД.

it{Factory.build(:user).should respond_to(:name)}

Update

"Существует одно исключение, которое создает на самом деле" создает ", когда вы строите ассоциации, т.е. ваша связь больше не в памяти, а сохраняется. Помните об этом" - Shakes

Ответ 2

Использование FactoryGirl.build(: factory_name) не сохраняется в db и не вызывает save!, поэтому ваши проверки ActiveRecord не будут выполняться. Это намного быстрее, но валидации могут быть важны.

Использование FactoryGirl.create(: factory_name) будет сохраняться в db и будет вызывать проверки ActiveRecord. Это, очевидно, медленнее, но может ловить ошибки проверки (если вы заботитесь о них в своих тестах).