FactoryGirl与验证有很多联系

Eri*_*tch 19 ruby-on-rails factory-bot

我有一个标准的has_many关系(预订有很多订单),验证如果没有至少一个订单,预订不会得到保存.我正试图用FactoryGirl工厂复制这个,但验证阻止我这样做.

class Booking < ActiveRecord::Base
  has_many :orders
  validates :orders, presence: true
end

class Order < ActiveRecord::Base
  belongs_to :booking
end
Run Code Online (Sandbox Code Playgroud)

以下是FactoryGirl的GitHub维基页面中每个型号的FactoyGirl工厂规格.

FactoryGirl.define do                                                    

  factory :booking do                                                                                                                   
    factory :booking_with_orders do

      ignore do                                                                                                                         
        orders_count 1                                                                                                                  
      end                                                                                                                               

      before(:create) do |booking, evaluator|                                                                                           
        FactoryGirl.create_list(:order, evaluator.orders_count, booking: booking)                                                       
      end                                                                                                                               
    end                                                                                                                                 
  end 

  factory :order do
    booking
  end

end 
Run Code Online (Sandbox Code Playgroud)

当我尝试FactoryGirl.create(:booking_with_orders)从我的规范运行时,我得到:

Failure/Error: @booking = FactoryGirl.create(:booking_with_orders)
ActiveRecord::RecordInvalid:
  Validation failed: Orders can't be blank
Run Code Online (Sandbox Code Playgroud)

似乎验证的检查正在运行,甚至在before(:create) [...]此之前理论上会创建预订的订单.

这篇文章建议不要has_many为你的工厂添加关系,但如果有一个很好的方法,我想解决这个问题.

提前致谢.

jas*_*ssa 33

笏?不可能?一点也不.

只需将您的代码更改为以下内容:

after :build do |booking, evaluator|
  booking.orders << FactoryGirl.build_list(:order, evaluator.orders_count, booking: nil)
end
Run Code Online (Sandbox Code Playgroud)