The Factory Girl introduction描述了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)
我仍然不明白两者之间的实际差异。有人能给予个例子,你想用一个而不是另一个吗?谢谢!
3条答案
按热度按时间jfgube3f1#
create()
方法持久化模型的示例,而build()
方法仅将其保存在内存中。就我个人而言,我只在真正需要持久性时才使用
create()
方法,因为写入数据库会使测试耗时。例如
我使用
create()
创建要进行身份验证的用户,因为我的身份验证引擎会查询数据库。要检查模型是否具有属性,
build()
方法将完成,因为不需要DB访问。更新
“有一个例外,当你构建关联时,build实际上是‘创建’的,即你的关联不再在内存中,而是持久化的。记住这一点- Shakes
j0pj023g2#
使用
FactoryGirl.build(:factory_name)
不会持久化到数据库,也不会调用save!
,因此活动记录验证将不会运行。这要快得多,但验证可能很重要。使用
FactoryGirl.create(:factory_name)
将持久化到数据库,并将调用活动记录验证。这显然较慢,但可以捕获验证错误(如果您在测试中关心它们)。0sgqnhkj3#
FactoryGirl.create()
将为它创建新的对象和关联(如果工厂有)。它们都将被保存在数据库中。此外,它将触发模型和数据库验证。保存工厂后将调用回调after(:build)
和after(:create)
。在保存工厂之前,还会调用before(:create)
。FactoryGirl.build()
不会保存对象,但如果工厂有关联,仍然会向数据库发出请求。它将仅触发关联对象的验证。回调after(:build)
将在工厂建成后调用。请注意,在大多数情况下,当测试模型时,最好使用
build_stubbed
以获得更好的性能。阅读更多关于here。