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

Ave*_*ery 88 ruby factory-bot

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)
Run Code Online (Sandbox Code Playgroud)

我仍然不明白两者之间的实际差异.有人可以给出一个例子,你想要使用一个而不是另一个吗?谢谢!

Hel*_*tos 110

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

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

例如

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

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

it{Factory.build(:user).should respond_to(:name)}
Run Code Online (Sandbox Code Playgroud)

更新

"当你建立联想时,有一个例外构建实际上'创建',即你的关联不再在记忆中而是持续存在.记住这一点" - Shakes

  • 在构建关联时,有一个例外构建实际上是"创建",即您的关联不再在内存中而是持久存在.记在脑子里 (14认同)

cha*_*asm 12

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

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

  • 或者,你可以只做FactoryGirl.build(:factory_name).有效?运行验证而不保存到数据库. (11认同)

Nes*_*ric 5

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

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

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