是什么在FactoryGirl构建和创建方法之间的区别?(What's the differ

2019-07-17 17:12发布

该工厂女孩介绍描绘的区别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)

我仍然不明白两者之间的实际差异。 有人可以举个例子,你可能需要使用一个,而不是其他? 谢谢!

Answer 1:

create()而该方法仍然存在模型的实例build()方法保持它只是在内存中。

就个人而言,我用的是create()只有当持久真的是必要的,因为写DB使得测试费时的方法。

我创建用户的认证create()因为我鉴定引擎查询数据库。

要检查模型有一个属性的build()因为不需要DB访问方法就可以了。

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

更新

“有,实际上建立一个例外‘创造’,当你建立关联,即你的公会是在内存中不再坚持,但牢记这一点。” - 奶昔



Answer 2:

使用FactoryGirl.build(:factory_name)不会坚持到数据库,并不会调用save! ,所以你的活动记录验证将不会运行。 这是更快,但验证可能是非常重要的。

使用FactoryGirl.create(:factory_name)将持续到数据库并调用Active Record的验证。 这显然是速度较慢,但​​能赶上验证错误(如果你在测试中关心他们)。



Answer 3:

FactoryGirl.create()将创建新的对象和协会(如果工厂有什么)吧。 他们都将在数据库中保留。 此外,它会同时触发模型和数据库验证。 回调after(:build)after(:create)的工厂被保存后会被调用。 此外before(:create)将被保存在出厂之前调用。

FactoryGirl.build()不会救一个对象,但仍然会要求一个数据库,如果工厂有关联。 这将触发验证只为关联对象。 回调after(:build)工厂建成后,将被调用。

注意,在大多数情况下,当测试模型是最好用build_stubbed获得更好的性能。 了解更多关于它在这里 。



文章来源: What's the difference between the build and create methods in FactoryGirl?