工厂女孩:想要防止工厂女孩回调一些特质

时间:2017-03-09 13:23:48

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

我有一个FactoryGirl的模型类。在这个模型中,我定义了一些特征。在某些特征中,我不想要FactoryGirl回拨电话,但我不知道如何。例如,这是我的代码:

FactoryGirl.define do
  factory :product do
    sequence(:promotion_item_code) { |n| "promotion_item_code#{n}" }

    after :create do |product|
      FactoryGirl.create_list :product_details, 1, :product => product
    end

    trait :special_product do
       # do some thing
       # and don't want to run FactoryGirl callback
    end
end

在此代码中,我不想要:special_product个特征调用after :create。我不知道该怎么做。

@Edit:我想要这个的原因,因为有时我想从父母生成数据 - >儿童。但有时候我想反过来从孩子到父母产生。所以当我离开孩子时 - >父,父进程的回调被调用,因此子被创建两次。那不是我想要的。

@Edit 2:我的问题是阻止来自FactoryGirl的回调,而不是来自ActiveRecord模型。

由于

2 个答案:

答案 0 :(得分:2)

您可以使用transient attributes来实现这一目标。

像:

factory :product do
  transient do
    create_products true
  end

  sequence(:promotion_item_code) { |n| "promotion_item_code#{n}" }

  after :create do |product, evaluator|
    FactoryGirl.create_list(:product_details, 1, :product => product) if evaluator.create_products
  end

  trait :special_product do
     # do some thing
     # and don't want to run FactoryGirl callback
  end
end

但我认为对这个问题进行建模的更好方法是为“基本案例”定义一个trait或者有多个工厂。

答案 1 :(得分:0)

您可以使用工厂女孩文档中描述的相同方法has_many relationship

factory :product_detail do
  product
  #... other product_detail attributes
end

factory :product do
  sequence(:promotion_item_code) { |n| "promotion_item_code#{n}" }

  factory :product_with_details do
    transient do
      details_count 1  # to match your example.
    end

    after(:create) do |product, evaluator|
      create_list(:product_detail, evaluator.details_count, product: product)
    end
  end

  trait :special_product do
    # do some thing
    # and don't want to run FactoryGirl callback
  end
end

这允许您为parent-> children:

生成数据
create(:product_with_details)                   # creates a product with one detail.
create(:product_with_details, details_count: 5) # if you want more than 1 detail.

......以及特殊产品

# does not create any product_details.
create(:product)
create(:product, :special_product)

为儿童生成 - >父母

create(:product_detail)