Factory Girl 将参数传递给 trait

Factory Girl pass parameter to trait

我一直在为此苦思冥想。我希望能够在特征之上覆盖属性。我一直在阅读 documentation 和一些互联网示例,但我无法让它工作。

这就是我想做的事情:

test "..." do 
 #overwrite start_time
 middle = create( :basic_instant_instance, start: 1.hours.ago)
end 

FactoryGirl.define do

  factory :instant_instance do

  trait :active_now do 
    #attributes...
    transient do
      start nil
    end  
    #overwrite start_time
    start_time start.present? ? start : Time.now
  end

  factory :basic_instant_instance,          traits: [:active_now] 
end   

我不断收到:

ArgumentError: Trait not registered: start

你需要稍微重新考虑一下你的策略 - 你有一个 basic_instant_instance 不继承自 instant_instance 因此对特征 [:active_now] 一无所知或开始属性。

您还需要在构建 Factory 实例时评估 start_time,方法是将其放在大括号中。否则它将在初始化之前被评估。

尝试如下操作:

FactoryGirl.define do
  factory :instant_instance do
    trait :active_now do 
      # attributes...

      transient do
        start { nil }
      end

      # overwrite start_time
      start_time { start.present? ? start : Time.now }
    end
  end
end

然后这样称呼它:

create(:instant_instance, :active_now, start: 1.hours.ago)