【问题标题】:What's the difference between the build and create methods in FactoryGirl?FactoryGirl 中的 build 和 create 方法有什么区别?
【发布时间】:2012-12-15 09:39:26
【问题描述】:

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)

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

【问题讨论】:

    标签: ruby factory-bot


    【解决方案1】:

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

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

    例如

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

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

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

    更新

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

    【讨论】:

    • 有一个例外,当您构建关联时,构建实际上是“创建”,即您的关联不再在内存中而是持久存在。记住这一点
    • @Shakes,我不再在 Rails 中工作了。我会尽快检查。
    • 有没有人制作了一个工具来将create的每个实例替换为build,如果测试失败则撤消它?
    • #create 是从磁盘读取并返回持久化对象,还是在持久化后返回内存中的对象?换句话说,create(...) 是否等同于 create(...).reload
    【解决方案2】:

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

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

    【讨论】:

    • 或者,你可以只做 FactoryGirl.build(:factory_name).valid?它运行验证而不保存到数据库。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 2019-04-18
      • 2015-07-12
      • 2018-10-18
      • 2022-07-04
      • 1970-01-01
      相关资源
      最近更新 更多