【问题标题】:How to implement :with_trait using Fabrication如何使用 Fabrication 实现 :with_trait
【发布时间】:2015-04-05 08:48:25
【问题描述】:

我正在考虑将许多模拟从 FactoryGirl 迁移到 Fabrication gem。

但是,到目前为止,我还没有找到任何有关实现 FactoryGirl 中可用的 trait 模式的信息。

是否有一种普遍接受的方法来使用 Fabrication 执行此操作?

提前感谢您提供任何答案或信息。

【问题讨论】:

    标签: ruby-on-rails mocking factory-bot fabrication-gem


    【解决方案1】:

    Fabrication 没有特征的语法糖。据我了解,这只是一种分组和定义继承的方式。

    以这个工厂为例:(我从this blog post 中提取)

    FactoryGirl.define do
      factory :todo_item, aliases: [:incomplete_todo_item] do
        name 'Pick up a gallon of milk'
        complete false
    
        factory :complete_todo_item do
          complete true
        end
      end
    end
    

    你会在 Fabrication 中做同样的事情:

    Fabricator(:todo_item, aliases: :incomplete_todo_item) do
      name 'Pick up a gallon of milk'
      complete false
    end
    
    Fabricator(:complete_todo_item, from: :todo_item) do
      complete true
    end
    

    如果您决定转换,您可以发送至mailing list 并提出任何具体问题。我总是很乐意帮助您弄清楚如何让事情正常进行或提高制造商的效率。

    【讨论】:

    • 谢谢 Paul,有效的特征有助于避免重复并在 FactoryGirl DRY 中继续模拟工厂。正是这种重复让我对制造感到担忧
    • 我认为特质不会增加任何真正的价值。我在上面列出的制造商与基于特征的制造商一样干燥且更简洁。你能给我举个例子,说明你正在用哪些特性来真正使它成为一个有益的特性吗?我从未见过使用它的重要示例。
    • 我们正在使用它们来设置复杂的模型,这些模型的差异很小(但很重要),这会影响业务逻辑的处理方式。至少在我看来,要将它们实现为单独的 Fabricator 对象,需要大量重复的样板。
    • 例如,假设我们有一个人事记录,其中附有电子邮件地址、电话号码、个人资料照片、紧急联系人等列表。假设我们要进行测试以确保对象的行为正如预期的那样,当有多个电子邮件地址时,其中一些可能在域白名单(或黑名单)中......我们通常会分配特征来提供这些关联。老实说,在很多情况下,我们使用 trait 对模拟模型进行小改动,以致于仅展示一个示例有点不足。如果你有时间,我想进一步讨论这个问题。
    • 引用 ThoughtBot 的博客文章 - “特征是向工厂添加单个状态的好方法,而无需实现大量层次结构。” ...它正在避免在这里特别讨论的这种庞大的层次结构。
    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    相关资源
    最近更新 更多