ruby FactoryGirl中的build和create方法有什么区别?

xoefb8l8  于 2023-06-22  发布在  Ruby
关注(0)|答案(3)|浏览(209)

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)

我仍然不明白两者之间的实际差异。有人能给予个例子,你想用一个而不是另一个吗?谢谢!

jfgube3f

jfgube3f1#

create()方法持久化模型的示例,而build()方法仅将其保存在内存中。
就我个人而言,我只在真正需要持久性时才使用create()方法,因为写入数据库会使测试耗时。
例如
我使用create()创建要进行身份验证的用户,因为我的身份验证引擎会查询数据库。
要检查模型是否具有属性,build()方法将完成,因为不需要DB访问。

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

更新

“有一个例外,当你构建关联时,build实际上是‘创建’的,即你的关联不再在内存中,而是持久化的。记住这一点- Shakes

j0pj023g

j0pj023g2#

使用FactoryGirl.build(:factory_name)不会持久化到数据库,也不会调用save!,因此活动记录验证将不会运行。这要快得多,但验证可能很重要。
使用FactoryGirl.create(:factory_name)将持久化到数据库,并将调用活动记录验证。这显然较慢,但可以捕获验证错误(如果您在测试中关心它们)。

0sgqnhkj

0sgqnhkj3#

FactoryGirl.create()将为它创建新的对象和关联(如果工厂有)。它们都将被保存在数据库中。此外,它将触发模型和数据库验证。保存工厂后将调用回调after(:build)after(:create)。在保存工厂之前,还会调用before(:create)
FactoryGirl.build()不会保存对象,但如果工厂有关联,仍然会向数据库发出请求。它将仅触发关联对象的验证。回调after(:build)将在工厂建成后调用。
请注意,在大多数情况下,当测试模型时,最好使用build_stubbed以获得更好的性能。阅读更多关于here

相关问题