0

我有三个模型:用户、产品和所有权。所有权属于用户和产品。产品和用户有许多所有权。

我使用 FactoryGirl gem 创建了以下工厂:

factory :user do
  sequence(:name)  { |n| "Robot #{n}" }
  sequence(:email) { |n| "numero#{n}@robots.com"}
  association :location, factory: :location
end

factory :product do
  sequence(:name) { |n| "Objet #{n}" }
  association :location, factory: :location
end

factory :ownership do
  association :user, factory: :user
  association :product, factory: :product
end

我这样使用它:

let(:user) { FactoryGirl.create(:user) }
let(:product) { FactoryGirl.create(:product) }
let(:ownership) { FactoryGirl.create(:current_ownership, user: user, product: product) }

但我想改进我的工厂,为了做到这一点:

let(:user) { FactoryGirl.create(:user) }
let(:product) { FactoryGirl.create(:product, owner: user) }

你知道怎么做吗?

4

1 回答 1

0

您可以使用工厂女孩 after_create 回调来做到这一点:

FactoryGirl.define do
  factory :product do
    # ...

    ignore do
      owner nil
    end

    after :create do |product, ev|
      if ev.owner
        create :ownership, user: ev.owner, product: product
      end
    end
  end
end

这样您就可以配置工厂,以便您可以将所有者属性传递给它。忽略块确保此属性不会传递给对象的构造函数,但您可以在工厂女孩的回调中使用它。

您可以在此处找到有关工厂女孩回调的更多信息。

于 2013-08-26T09:10:56.767 回答