【问题标题】:Factory Girl pass parameter to traitFactory Girl 将参数传递给 trait
【发布时间】:2016-10-24 00:05:45
【问题描述】:

我一直在努力解决这个问题。我希望能够覆盖特征之上的属性。我一直在阅读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:特征未注册:开始

【问题讨论】:

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


    【解决方案1】:

    您需要在这里重新考虑一下您的策略 - 您有一个 basic_instant_instance,它不继承自 instant_instance,因此对 trait [:active_now] 或 start 属性一无所知。

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

    尝试以下方法:

    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, start: 1.hours.ago, :active_now)
    

    【讨论】:

    • 似乎我无法将瞬态数据传递给特征是错误的 - 已相应地修改了我的解决方案,并且还意识到您需要花括号来正确评估
    • 它也适用于:create(:basic_instant_instance, start: 1.hours.ago)。顺便说一句,我不明白:“basic_instant_instance ... 不继承自instant_instance,因此对 trait [:active_now] 或 start 属性一无所知。”
    • 如果您访问inheritance,而不是试图在评论中更好地解释它。如有必要,我可以在答案中添加更多信息。
    • 你是什么意思它也适用于create( :basic_instant_instance, start: 1.hours.ago) ...我以为你得到了trait not registered error
    • 是的,但它似乎是由大括号引起的,正如您在回答中所建议的那样:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 2019-09-27
    • 1970-01-01
    相关资源
    最近更新 更多