2013-12-17 50 views
2

我試圖用FactoryGirl建立一個Hash返回是這樣的:FactoryGirl工廠性狀,它返回一個哈希與弦鍵

=> {"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需要在一個塊,但沒有什麼區別。

有什麼建議嗎?

回答

2

忽略的屬性被定義爲可以從其他屬性使用的方法。當提到他們,你需要定義使用塊依賴屬性:

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"文字值。

更新

正如在評論中提到,你可能想fake_word使用塊爲好。

+0

謝謝你。它接近SUPER,但不幸的是不是一個可行的解決方案。構建的每個工廠對象對於鍵「」2「'具有相同的值。與我爲@vimsha http://pastie.org/8559316粘貼的輸出相同。我確信這與「懶惰屬性」(https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#lazy-attributes)有關,但不確定如何實施解決方案。 – user3084728

+0

啊,明白了!第3行應該是:'fake_word {Faker :: Lorem.word}'。如果你更新答案,我會選擇正確的 – user3084728

+0

是的,如果你每次想要一個不同的單詞,你也會想要一個塊。我更新了答案。 –

0

試試這個。

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 
+0

我已經嘗試過這一點,它的工作。你用這個構建的所有工廠對象都具有相同的屬性...例如:http://pastie.org/8559316(我希望'fake_word'應該改變) – user3084728