Во вступлении Factory Girl подчеркивается разница между FactoryGirl.build()
и FactoryGirl.create()
:
# Returns a User instance that's not saved
user = FactoryGirl.build(:user)
# Returns a saved User instance
user = FactoryGirl.create(:user)
Я до сих пор не понимаю практических различий между ними. Может ли кто-нибудь привести пример, в котором вы хотели бы использовать одно, а не другое? Благодарность!
источник
create
сbuild
, и отменить его , если тест не пройден?#create
и возвращает сохраненный объект с диска или возвращает объект, который находится в памяти, после его сохранения? Другими словами, этоcreate(...)
эквивалентноcreate(...).reload
?Использование
FactoryGirl.build(:factory_name)
не сохраняется в базе данных и не вызываетsave!
, поэтому ваши проверки Active Record не будут выполняться. Это намного быстрее, но проверки могут быть важны.Использование
FactoryGirl.create(:factory_name)
будет сохраняться в базе данных и вызовет проверки Active Record. Это, очевидно, медленнее, но может обнаруживать ошибки проверки (если вы заботитесь о них в своих тестах).источник
FactoryGirl.create()
создаст для него новый объект и ассоциации (если они есть на фабрике). Все они будут сохранены в базе данных. Кроме того, это вызовет проверку как модели, так и базы данных. Обратные вызовыafter(:build)
иafter(:create)
будут вызываться после сохранения фабрики. Такжеbefore(:create)
будет вызываться перед сохранением фабрики.FactoryGirl.build()
не будет сохранять объект, но все равно будет делать запросы к базе данных, если у фабрики есть ассоциации. Это вызовет проверки только для связанных объектов. Обратныйafter(:build)
вызов будет вызван после того, как фабрика будет построена.Обратите внимание, что в большинстве случаев при тестировании модели лучше всего использовать
build_stubbed
для повышения производительности. Подробнее об этом читайте здесь .источник