2011-02-24 19 views
30

मैं इस तरह के कोड मॉडल कारखाना है:FactoryGirl: मुझे जुड़ा नहीं दे रही है attributes_for विशेषताओं

Factory.define :code do |f| 
    f.value "code" 
    f.association :code_type 
    f.association(:codeable, :factory => :portfolio) 
end 

लेकिन जब मैं इस तरह एक साधारण test_should_create_code के साथ अपने नियंत्रक का परीक्षण:

test "should create code" do 
    assert_difference('Code.count') do 
     post :create, :code => Factory.attributes_for(:code) 
    end 
    assert_redirected_to code_path(assigns(:code)) 
    end 

... परीक्षण विफल रहता है। नया रिकॉर्ड नहीं बनाया गया है।

कंसोल में, ऐसा लगता है कि attributes_for बनाता है जैसे सभी आवश्यक गुण वापस नहीं करता है।

[email protected]:~/dev/my_rails_app$ rails console test 
Loading test environment (Rails 3.0.3) 
irb(main):001:0> Factory.create(:code) 
=> #<Code id: 1, code_type_id: 1, value: "code", codeable_id: 1, codeable_type: "Portfolio", created_at: "2011-02-24 10:42:20", updated_at: "2011-02-24 10:42:20"> 
irb(main):002:0> Factory.attributes_for(:code) 
=> {:value=>"code"} 

कोई विचार?

धन्यवाद,

उत्तर

23

आप कुछ इस तरह की कोशिश कर सकते हैं:

(Factory.build :code).attributes.symbolize_keys 

चेक करें: http://groups.google.com/group/factory_girl/browse_thread/thread/a95071d66d97987e)

+7

इसमें टाइमस्टैम्प, आईडी इत्यादि लौटने का अनचाहे दुष्प्रभाव है ... वास्तव में सभी समस्याओं के लिए समाधान नहीं है – coneybeare

+2

@ कॉनीबीयर: इसके लिए एक आसान फिक्स है। Http://stackoverflow.com/questions/10290286/factorygirl-why-does-attributes-for-omit-some-attributes –

+0

पर समाधान देखें मेरे लिए काम नहीं: यह दिखाता है "MassAssignmentSecurity :: त्रुटि: द्रव्यमान नहीं हो सकता है- संरक्षित विशेषताओं को असाइन करें: id, created_at, update_at .. " –

9

यह एक टाइम स्टांप वापस नहीं करता है आदि, केवल गुण है कि बड़े पैमाने के लिए उपलब्ध हैं काम:

(FactoryGirl.build :position).attributes.symbolize_keys.reject { |key, value| !Position.attr_accessible[:default].collect { |attribute| attribute.to_sym }.include?(key) } 

फिर भी, यह काफी बदसूरत है। मुझे लगता है कि फैक्ट्रीगर्ल को इस तरह के बॉक्स से बाहर कुछ देना चाहिए।

मैंने इस here के लिए एक अनुरोध खोला।

9

मैं अभी तक एक अन्य दृष्टिकोण है, जो मुझे लगता है कि है स्पष्ट सुझाव देंगे:

attr = attributes_for(:code).merge(code_type: create(:code_type)) 
+2

आप' attributes_for (: code) .merge (code_type_attributes: attributes_for (: code_type) भी कर सकते हैं) ' – Matt

2

यहाँ मैं क्या कर रहा खत्म ...

conf = FactoryGirl.build(:conference) 
post :create, {:conference => conf.attributes.slice(*conf.class.accessible_attributes) } 
2

मैं संश्लेषित किया है कि दूसरों ने कहा है , अगर यह किसी और की मदद करता है। फैक्ट्रीगर्ल के प्रश्न के अनुरूप होने के लिए, मैंने फैक्टरीगर्ल.बिल्ड() के बजाय फैक्टरी.बिल्ड() का उपयोग किया है। आवश्यक के रूप में अद्यतन करें।

def build_attributes_for(*args) 
    build_object = Factory.build(*args) 
    build_object.attributes.slice(*build_object.class.accessible_attributes).symbolize_keys 
end 

सीधे शब्दों में Factory.attributes_for के स्थान पर इस विधि कॉल:

post :create, :code => build_attributes_for(:code) 

पूर्ण सार (एक सहायक मॉड्यूल के भीतर) यहाँ है: https://gist.github.com/jlberglund/5207078

0

मेरी एपीपी/कल्पना/नियंत्रकों में/pages_controllers_spec.rb मैं सेट करता हूं:

 
let(:valid_attributes) { FactoryGirl.attributes_for(:page).merge(subject: FactoryGirl.create(:theme), user: FactoryGirl.create(:user)) } 

क्योंकि मेरे पास दो मॉडल जुड़े हैं । यह भी काम करता है:

 
FactoryGirl.define do 
    factory :page do 
     title  { Faker::Lorem.characters 12 } 
     body  { Faker::Lorem.characters 38 } 
     discution false 
     published true 
     tags  "linux, education, elearning" 
     section { FactoryGirl.create(:section) } 
     user  { FactoryGirl.create(:user) }                                
    end 
    end 
0

यहां एक और तरीका है। आप शायद id, created_at और updated_at विशेषताओं को छोड़ना चाहते हैं।

FactoryGirl.build(:car).attributes.except('id', 'created_at', 'updated_at').symbolize_keys

सीमाएं:

  • यह एचएमटी और HABTM संघों के लिए गुण उत्पन्न नहीं करता है (जैसा कि इन संगठनों, एक मेज में शामिल होने में जमा हो जाती और न कि वास्तविक विशेषता)।
  • कारखाने में एसोसिएशन रणनीति create होना चाहिए, जैसा कि association :user, strategy: :create में है। यदि आप बुद्धिमानी से इसका उपयोग नहीं करते हैं तो यह रणनीति आपके कारखाने को बहुत धीमा कर सकती है।
संबंधित मुद्दे