【问题标题】:FactoryGirl factory with Trait(s) that returns a Hash with stringed keys具有 Trait(s) 的 FactoryGirl 工厂,它返回带有字符串键的哈希
【发布时间】:2013-12-17 21:25:44
【问题描述】:

我正在尝试使用FactoryGirl 构建一个返回如下内容的Hash

 => {"3"=>"1", "6"=>"Word"}

我已经接近了,但还不是 100%...

我尝试的第一个工厂定义如下所示:

factory :faqtory, class: Hash do |f|
  f.ignore do
    fake_word Faker::Lorem.word
  end

  f.sequence(1.to_s) { |n| n }
  f.send(2.to_s,  fake_word.to_s.capitalize)

  initialize_with { attributes.stringify_keys }
end

不幸的是,这不起作用:

1.9.3p448 :001 > FactoryGirl.build :faqtory
ArgumentError: Trait not registered: fake_word

在那之后不起作用,我认为对fake_word 的调用需要在一个块中,但这没有区别。

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    被忽略的属性被定义为可以从其他属性中使用的方法。引用它们时,需要使用块定义依赖属性:

    factory :faqtory, class: Hash do |f|
      f.ignore do
        fake_word { Faker::Lorem.word }
      end
    
      f.sequence(1.to_s) { |n| n }
      f.send(2.to_s) { fake_word.to_s.capitalize }
    
      initialize_with { attributes.stringify_keys }
    end
    

    定义不带块的属性仅适用于 1"hello" 等文字值。

    更新

    如 cmets 中所述,您可能希望 fake_word 也使用块。

    【讨论】:

    • 谢谢你。它非常接近,但不幸的是不是一个有效的解决方案。每个构建的工厂对象都具有相同的键值 "2".. 与我为 @vimsha pastie.org/8559316 粘贴的输出相同。我确信这与“惰性属性”(github.com/thoughtbot/factory_girl/blob/master/…)有关,但不确定如何实现解决方案。
    • 啊,明白了!第 3 行应为:fake_word { Faker::Lorem.word }。如果你更新答案,我会选择正确的
    • 是的,如果您每次都想要一个不同的词,那么您也需要一个块。我更新了答案。
    【解决方案2】:

    试试这个。

      factory :faqtory, class: Hash do |f|
        fake_word = Faker::Lorem.word
    
        f.sequence(1.to_s) { |n| n }
        f.send(2.to_s,  fake_word.to_s.capitalize)
    
        initialize_with { attributes.stringify_keys }
      end
    

    【讨论】:

    • 我已经尝试过了,它有点工作。您使用它构建的所有工厂对象都将具有相同的属性……例如:pastie.org/8559316(我希望fake_word 应该改变)
    猜你喜欢
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2015-11-28
    • 2011-08-22
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多