factorygirl协会验证

时间:2017-03-05 00:58:14

标签: ruby-on-rails validation associations

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,但程序表只有四个记录,其中包含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中创建协会要困难得多。谢谢你的阅读。

2 个答案:

答案 0 :(得分:0)

根据Factory Girl的文档尝试类似:

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

有关Factory Girl协会的更多信息,请点击链接: https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#associations

答案 1 :(得分:0)

此:

FactoryGirl.define do
  program       #association

创建新的程序记录,作为关联附加(与其他一些ID,也可以是1193或任何其他ID)。

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