FactoryGirl中的构建方法和创建方法有什么区别?

时间:2012-12-31 05:57:55

标签: ruby factory-bot

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 个答案:

答案 0 :(得分:108)

create()方法持久保存模型实例,而build()方法仅将其保留在内存中。

就个人而言,我只在真正需要持久性时使用create()方法,因为写入数据库会使测试耗费时间。

e.g。

我使用create()创建用户身份验证,因为我的身份验证引擎会查询数据库。

要检查模型是否具有build()方法将执行的属性,因为不需要DB访问。

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

更新

"有一个例外,即实际构建'当你建立联想时,你的关联不再是记忆而是坚持。牢记这一点" - 摇晃

答案 1 :(得分:12)

使用FactoryGirl.build(:factory_name)不会持久保存到数据库,也不会调用save!,因此您的Active Record验证将不会运行。这要快得多,但验证可能很重要。

使用FactoryGirl.create(:factory_name)将持久保存到数据库,并将调用Active Record验证。这显然较慢但可以捕获验证错误(如果您在测试中关心它们)。

答案 2 :(得分:1)

FactoryGirl.create()将为它创建新对象和关联(如果工厂有任何关联)。它们都将被保存在数据库中。此外,它将触发模型和数据库验证。 保存工厂后将调用回调after(:build)after(:create)。在保存工厂之前,还会调用before(:create)

FactoryGirl.build()不会保存对象,但如果工厂有关联,它仍会向数据库发出请求。它将仅触发关联对象的验证。 工厂建成后将调用回调after(:build)

请注意,在大多数情况下,测试模型最好使用build_stubbed以获得更好的性能。阅读更多相关信息here