105

Factory Girl 的介绍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)

我仍然不明白两者之间的实际区别。有人可以举一个例子,你想使用一个而不是另一个吗?谢谢!

4

3 回答 3

136

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

就个人而言,我create()仅在确实需要持久性时才使用该方法,因为写入数据库会使测试耗时。

例如

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

要检查模型是否具有属性,该build()方法将执行此操作,因为不需要数据库访问。

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

更新

“有一个例外,当你建立关联时,构建实际上是‘创造’,即你的关联不再存在于内存中而是持续存在。记住这一点”——Shakes

于 2013-01-04T21:03:01.120 回答
17

UsingFactoryGirl.build(:factory_name)不会持续到 db 并且不会调用save!,因此您的 Active Record 验证将不会运行。这要快得多,但验证可能很重要。

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

于 2013-08-01T19:51:59.937 回答
4

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

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

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

于 2018-05-04T10:00:52.417 回答