【问题标题】:factory girl uniqueness validation fails for associated factories关联工厂的工厂女孩​​唯一性验证失败
【发布时间】:2013-05-19 13:25:00
【问题描述】:

我有(简化的)工厂定义如下:

factory :league do
  acronym 'NBA'
end

factory :division do
  league
end

部门属于联赛。当我定义这个工厂时,我假设将创建 1 个联赛,并且该联赛将被一遍又一遍地重用,以便为部门提供真正的联赛 ID。

相反,我在第二次调用 FactoryGirl.create(:division) 时遇到了错误,因为联盟 acronym 应该是唯一的。

class League < ActiveRecord::Base
  validates :acronym, uniqueness: true
end

导致以下测试中断

ActiveRecord::RecordInvalid: 验证失败:首字母缩写词已被使用

我该如何解决这个问题,最好不要在测试设置中创建层次结构?

如果我想要完成的工作比 factory_girl 更好,请提出建议

【问题讨论】:

    标签: ruby-on-rails unit-testing factory-bot


    【解决方案1】:

    在您的联赛定义中使用initialize_with

    http://robots.thoughtbot.com/post/16196616388/factory-girl-2-5-gets-custom-constructors

    然后您可以发出find_or_create_by_acronym 以保证它被创建一次。

    【讨论】:

      【解决方案2】:

      根据您调用 FactoryGirl.create 的位置,将为您拥有的每个规范创建记录。你想要的是database_cleaner,一旦设置,它会在每个规范之后清理你的数据库,确保你的验证错误不再是问题。

      编辑

      哎呀,我看错了你的问题。您要做的是使用faker gem 为每个首字母缩略词生成随机字符串,或者像这样使用factory_girl 序列

      FactoryGirl.define do
        sequence :acronym do |n|
          "NBA#{n}"
        end
      
        factory :league do
          acronym
        end
      end
      

      使用序列实际上将确保创建的每个联赛都有一个唯一的首字母缩写词。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多