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)
我仍然不明白两者之间的实际差异。有人可以给出一个例子,你想要使用一个而不是另一个吗?谢谢!
答案 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。