factorygirl 协会验证

Posted

技术标签:

【中文标题】factorygirl 协会验证【英文标题】:factorygirl association validation 【发布时间】:2017-03-05 00:58:13 【问题描述】:
class Program < ActiveRecord::Base
has_many :contacts

class Contact < ActiveRecord::Base
belongs_to :program

FactoryGirl.define do
  factory :contact do
  sequence(.... 
   ...
  program_id 1  #foreign key
  program       #association

(byebug) contact
Contact id: 949, display_name: "Contact-3", business_phone: "1234567894", fax_number: "1234567894", created_at: "2017-03-05 00:43:24", updated_at: "2017-03-05 00:43:24", first_name: "First-4", last_name: "Last-4", middle_initial: "4", email: "Email4@Something.Com", program_id: 1193, 287g: nil, active: true, call_office_id: 4

在使用联系人工厂创建的联系人记录中,program_id 为 1193,但程序表中只有 4 条 id 为 1-4 的记录。不确定 1193 的来源。在这一点上,rspec 测试或多或少地成功了。但是一旦下面的验证代码被添加到联系人模型中,rspec 测试就会失败。

为程序添加关联验证的联系模型

class ProgramValidator < ActiveModel::Validator
  def validate(record)
    if record.program.nil?
      record.errors[:base] << "Program cannot be blank"
    end
  end
end

class Contact < ActiveRecord::Base
  belongs_to :program
  validates_with ProgramValidator

现在运行 rspec,它抱怨“程序不能为空白”。问题:如何创建联系工厂以满足验证?为什么关联这么难,比在 ROR 中创建关联要困难得多。感谢阅读。

【问题讨论】:

【参考方案1】:

根据 Factory Girl 的文档,请尝试以下操作:

factory :contact do
  # ...
  association :program, factory: :program
end

有关工厂女孩协会的更多信息,请点击以下链接: https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#associations

【讨论】:

【参考方案2】:

这个:

FactoryGirl.define do
  program       #association

创建新的程序记录,该记录作为关联附加(带有其他 id,也可以是 1193 或任何其他 id)。

如果您不想创建任何新的程序记录,只需将program_id 1 留在您的工厂类中即可。另外,请记住您在空数据库中运行测试。 如果您创建程序记录(例如,在测试套件之前)并将其 ID 明确指定为 1,则此工厂类定义将起作用。

【讨论】:

以上是关于factorygirl 协会验证的主要内容,如果未能解决你的问题,请参考以下文章

Rspec和FactoryGirl有几种型号

绕过我的模型验证的工厂女孩​​创建

从FactoryGirl更新到factoryBot会导致NoMethodError

Factory Girl + Mongoid 在夹具中嵌入文档

跳过 Factory Girl 和 Rspec 的回调

FactoryGirl belongs_to 关联