FactoryGirls 多重关联

FactoryGirls multiple associations

我正在思考这个问题。我是 FactoryGirl 的新手,所以这可能在某处解释得很清楚,如果是这样的话,我深表歉意。这当然不是一个独特的问题,可能是我的 Google 技术不够好。

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

features/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

factories/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

factories/order_line.rb

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

factories/product.rb

FactoryGirl.define do

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

factories/categories.rb

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

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

如果我没猜错,你的类别名称唯一性有问题。

您可以使用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