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


95

Вступ до фабричної дівчини окреслює різницю між 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)

Я досі не розумію практичних відмінностей між ними. Хтось може навести приклад, коли ви хотіли б використовувати одне, а не інше? Дякую!

Відповіді:


117

create()Метод зберігається екземпляр моделі в той час як build()метод зберігає його тільки на пам'ять.

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

напр

Я створюю користувачів для автентифікації, create()оскільки мій механізм автентифікації запитує БД.

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

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

Оновлення

"Є один виняток, що побудова насправді" створює ", коли ви будуєте асоціації, тобто ваша асоціація вже не в пам'яті, а зберігається. Майте це на увазі" - Shakes


16
Є один виняток, що build фактично «створює», коли ви будуєте асоціації, тобто ваша асоціація вже не в пам'яті, а зберігається. Майте це на увазі
Шейкс

@ Shake, я більше не працюю в рейках. Я перевірю це, як тільки зможу.
Helio Santos

Хто - небудь зробив інструмент для заміни кожного примірника createз build, і скасувати його , якщо тест не пройдений?
mgold

Чи #createчитає та повертає збережений об'єкт з диска, чи повертає об'єкт, що знаходиться в пам'яті, після його збереження? Іншими словами, чи є create(...)еквівалент create(...).reload?
Денніс

@mgold Vim досить добре справляється з такими речами.
Обмежена викуп

15

Використання FactoryGirl.build(:factory_name)не зберігається на db і не викликає save!, тому перевірка Active Record не запускатиметься. Це набагато швидше, але перевірка може бути важливою.

Використання FactoryGirl.create(:factory_name)буде зберігатися на рівні db і викликатиме перевірку Active Record. Це, очевидно, повільніше, але може виявити помилки перевірки (якщо ви піклуєтесь про них у своїх тестах).


11
Або ви можете просто зробити FactoryGirl.build (: factory_name) .valid? які запускають перевірки без збереження в базі даних.
jinavar1

1

FactoryGirl.create()створить для нього новий об’єкт та асоціації (якщо їх має завод). Усі вони зберігатимуться у базі даних. Крім того, це спричинить перевірку як моделі, так і бази даних. Зворотні дзвінки after(:build)і after(:create)будуть викликані після збереження заводу. Також before(:create)буде викликаний до збереження заводу.

FactoryGirl.build()не збереже об’єкт, але все одно буде робити запити до бази даних, якщо завод має асоціації. Це буде ініціювати перевірку лише для асоційованих об'єктів. Зворотній дзвінокafter(:build) буде викликаний після побудови заводу.

Зверніть увагу, що в більшості випадків при тестуванні моделі найкраще використовувати build_stubbedдля кращої роботи. Детальніше про це читайте тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.