Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在使用FactoryGirl时验证多个关联是否至少有一个模型_Ruby On Rails_Ruby_Rspec_Factory Bot_Factory - Fatal编程技术网

Ruby on rails 在使用FactoryGirl时验证多个关联是否至少有一个模型

Ruby on rails 在使用FactoryGirl时验证多个关联是否至少有一个模型,ruby-on-rails,ruby,rspec,factory-bot,factory,Ruby On Rails,Ruby,Rspec,Factory Bot,Factory,撇开是否应该测试模型关联存在的争论不谈,我有一个名为Order的模型,我正在验证它的关联中至少有一个项,使用: class Order < ActiveRecord::Base has_many :items validates :items, presence: true end 根据工厂女孩的入门: 但是,当我运行规范时,Factory Girl会抛出一个FactoryGirl::InvalidFactoryError,因为订单工厂无效 解决方法 after(:buil

撇开是否应该测试模型关联存在的争论不谈,我有一个名为
Order
的模型,我正在验证它的
关联中至少有一个
,使用:

class Order < ActiveRecord::Base

  has_many :items

  validates :items, presence: true

end
根据工厂女孩的入门:

但是,当我运行规范时,Factory Girl会抛出一个
FactoryGirl::InvalidFactoryError
,因为订单工厂无效

解决方法

after(:build) do |order, evaluator|
   evaluator.items_count.times do
     order.items << FactoryGirl.create(:item)
   end
   #create_list(:item, evaluator.items_count, order: order)
 end
(:build)do | order之后的
evaluator|
evaluator.items\u count.times do

order.items根据定义,它将在构建后调用
.valid?
。它似乎会在(:build)
块之后运行
之前调用此函数

试着这样写你的工厂:

FactoryGirl.define do

  factory :order do

    ignore do
      items_count 1
    end

    after(:build) do |order, evaluator|
      create_list(:item, evaluator.items_count, order: order)
    end

  end
end
FactoryGirl.define do

  factory :order do

    ignore do
      items_count 1
    end

    items { build_list(:item, items_count) }

  end
end
这应该在调用
.valid?
之前生成项


让我知道这是否有效:)

您正在执行
创建列表(:项)
,是否有
工厂定义?是。项目工厂在那里并且是有效的。我认为你应该在(:create)
之后使用
而不是(:build)
之后使用
,因为在just build中,
订单
不会保存,也没有
订单id
用于
项目
@vee,但是如果它验证了至少一个项目的存在,在你的解决方案中,@Pedr是指
order.items吗
FactoryGirl.define do

  factory :order do

    ignore do
      items_count 1
    end

    items { build_list(:item, items_count) }

  end
end