factory girl:关联问题测试模型,其中包含validates_presence_of accepts_nested_attributes_for

kal*_*lle 1 ruby testing ruby-on-rails factory-bot

我有一个简单的联想:

class Account < ActiveRecord::Base
  has_many :users

  accepts_nested_attributes_for :users
  validates_presence_of :users
end
Run Code Online (Sandbox Code Playgroud)

class User < ActiveRecord::Base
  belongs_to :account
end
Run Code Online (Sandbox Code Playgroud)

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

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

与工厂:

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
Run Code Online (Sandbox Code Playgroud)

但我总是遇到这个错误:

'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
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助.

jig*_*fox 7

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
Run Code Online (Sandbox Code Playgroud)

另一种方法是检查属于哪一方的关联的存在.所以你需要改变你的模型:

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
Run Code Online (Sandbox Code Playgroud)