【问题标题】:factory girl: association problem testing model which has validates_presence_of accepts_nested_attributes_for工厂女孩:具有 validates_presence_of 接受_nested_attributes_for 的关联问题测试模型
【发布时间】:2010-06-24 11:31:20
【问题描述】:

我有一个简单的联想:

class Account < ActiveRecord::Base
  has_many :users

  accepts_nested_attributes_for :users
  validates_presence_of :users
end

class User < ActiveRecord::Base
  belongs_to :account
end

我只想运行一个简单的测试:

describe 'a new', Account do
  it 'should be valid' do
    Factory.build(:account).should be_valid
  end
end

与工厂:

Factory.define :account do |a|
  a.name                 { Faker::Company.name }
end

Factory.define :user do |u|
  u.association           :account
  u.email                 { Faker::Internet.email }
end

但我总是遇到这个错误:

'a new Account should be valid' FAILED
Expected #<Account id: nil, name: "Baumbach, Gerlach and Murray" > to be valid, but it was not
Errors: Users has to be present

好吧,我设置了正确的关联,但它不起作用...

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    validates_presence_of :users 在您的 Account 模型中负责失败的测试。您的帐户中至少需要一个用户,才能创建它。

    我不确定你真正想要做什么,所以我给你两种方法来解决这个问题。第一种选择是改变你的工厂:

    Factory.define :account do |a|
      a.name                 { Faker::Company.name }
      a.users                {|u| [u.association(:user)]}
    end
    
    Factory.define :user do |u|
      u.email                 { Faker::Internet.email }
    end
    

    另一种方法是检查关联方是否存在。所以你需要像这样改变你的模型:

    class Account < ActiveRecord::Base
      has_many :users
    
      accepts_nested_attributes_for :users
    end
    
    
    class User < ActiveRecord::Base
      belongs_to :account
      validates_presence_of :account
    end
    

    【讨论】:

    • 你的第二个小费有效。我认为 Rails 不会验证用户,除非你有“validates_presence_of :user”,但它似乎确实如此,除非我明确定义:accepts_nested_attributes_for :users, :reject_if => :all_blank thx,以便快速响应。
    • 如果您没有validates_presence_of :user,rails 不会验证用户。但是您已经设置了它,因此它可以验证用户的存在。您的代码表示您希望某些用户出现在您的帐户模型中。但是你没有给工厂账户任何用户,所以它一定会失败!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多