FactoryGirls多个协会

时间:2015-09-19 06:06:51

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

我正在努力思考这个问题。我对FactoryGirl很新,所以这可以在某处清楚解释,如果是这样我会道歉。这当然不是一个独特的问题,也许我的谷歌技能不太符合标准。

我正在处理订单,属于类别并属于客户。我正在尝试构建一个订购了5个订单的客户,但是当我尝试构建类别(需要一个唯一的名称)时,我会继续抛出唯一的错误。

设有/ customer_spec.rb

RSpec.feature "Customer management", :type => :feature do
    scenario "Customer with orders has order history" do
        customer = create(:customer, :with_5_completed_orders)
        visit customer_path(customer)
        expect(page).to have_content("Recent Orders")
    end
end

的工厂/ customers.rb

FactoryGirl.define do

    factory :customer do

        ...

        trait :with_5_completed_orders do
            after :create do |customer|
            create_list(:order_line, 5, :completed, :customer => customer)
        end
      end
   end
end

的工厂/ order_line.rb

FactoryGirl.define do
    factory :order_line do
        ....
        product
        ....
    end
end

的工厂/ product.rb

FactoryGirl.define do

    factory :product do |f|
        ....
        category
        ....
    end
end

的工厂/ categories.rb

FactoryGirl.define do
    sequence :category_name do |n|
      "category-#{n}"
    end

   factory :category do
       name { generate(:category_name) } 
   end
end

1 个答案:

答案 0 :(得分:0)

如果我做对了,你就会遇到类别名称唯一性的问题。

您可以使用sequences通过FactoryGirl生成唯一的类别名称:

sequence :category_name do |n|
  "category-#{n}"
end

factory :category do
  name { generate(:category_name) } 
end

FactoryGirl关于sequences的文档也值得一读。

如果您打算两次重复使用同一类别,您可以先创建一个并在所有订单中重复使用它:

trait :with_5_completed_orders do
  after :create do |customer|
    cat = generate(:category)
    create_list(:order_line, 5, :completed, customer: customer, category: cat)
  end
end