49

से गुजरता है मैं समूह के लिए अपने मॉडल/यूनिट परीक्षण में दो उदाहरण बनाने के लिए फैक्टरी गर्ल का उपयोग कर रहा हूं। मुझे लगता है कि एक फोन नीचे के अनुसार समाप्ति विशेषता के अनुसार रिटर्न .current को केवल 'वर्तमान' समूहों की जाँच करने के मॉडल का परीक्षण कर रहा हूँ ...फैक्ट्री-गर्ल बनाता है जो मेरे मॉडल सत्यापन

describe ".current" do 
    let!(:current_group) { FactoryGirl.create(:group, :expiry => Time.now + 1.week) } 
    let!(:expired_group) { FactoryGirl.create(:group, :expiry => Time.now - 3.days) } 

    specify { Group.current.should == [current_group] } 
    end 

मेरे समस्या यह है कि मैं मॉडल में मान्यता मिल गया है जो कि एक नई समूह की समाप्ति की जांच आज की तारीख के बाद है। यह नीचे सत्यापन विफलता उठाता है।

1) Group.current 
    Failure/Error: let!(:expired_group) { FactoryGirl.create(:group, :expiry => Time.now - 3.days) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Expiry is before todays date 

क्या फ़ैक्टरी गर्ल का उपयोग करते समय समूह को मजबूती से बनाने या सत्यापन के आसपास पहुंचने का कोई तरीका है?

उत्तर

62

यह FactoryGirl करने के लिए बहुत विशिष्ट नहीं है, लेकिन आप हमेशा सत्यापन बायपास कर सकते हैं जब save(:validate => false) के माध्यम से मॉडल की बचत: यह विशिष्ट तिथि-baesd सत्यापन मामले के लिए

describe ".current" do 
    let!(:current_group) { FactoryGirl.create(:group) } 
    let!(:old_group) { 
    g = FactoryGirl.build(:group, :expiry => Time.now - 3.days) 
    g.save(:validate => false) 
    g 
    } 

    specify { Group.current.should == [current_group] } 
end 
+0

है यही मैं के लिए, धन्यवाद क्या देख रहा था! – Norto23

+0

बेहतर समाधान के लिए जेसन डेनी के उत्तर को नीचे देखें। –

5

, आप भी timecop मणि को अस्थायी रूप से इस्तेमाल कर सकते हैं अतीत में बनाए गए पुराने रिकॉर्ड को अनुकरण करने के लिए समय निकालें।

1

अपने परिदृश्य के आधार पर आप केवल अद्यतन पर होने के लिए सत्यापन बदल सकते हैं। उदाहरण: :validates :expire_date, :presence => true, :on => [:update ]

46

मैं इस समाधान को https://github.com/thoughtbot/factory_girl/issues/578 से पसंद करता हूं।

कारखाने के अंदर:

to_create {|instance| instance.save(validate: false) } 
+4

यह स्वीकार किए गए एक से अधिक सुरुचिपूर्ण समाधान है। –

+3

ध्यान रखें कि यदि आपने इसे अपने सामान्य उद्देश्य कारखाने के लिए किया है तो आप उस फैक्ट्री पर हर बार सत्यापन छोड़ देंगे। संभवतः उप-फैक्ट्री (या एक विशेषता में) पर इस तकनीक का उपयोग करना सबसे अच्छा है। – tgf

+0

आप लगभग निश्चित रूप से इसे एक विशेषता में रखना चाहते हैं। नीचे टिम स्कॉट द्वारा जवाब देखें। –

3
foo = build(:foo).tap{ |u| u.save(validate: false) } 
6

यह एक बुरा विचार कारखाने में डिफ़ॉल्ट रूप से सत्यापन को छोड़ रहा है। कुछ बाल इसे खोजने के लिए बाहर खींच लिया जाएगा।

सबसे अच्छा तरीका है, मुझे लगता है:

trait :skip_validate do 
    to_create {|instance| instance.save(validate: false)} 
end 

फिर अपने परीक्षण में:

create(:group, :skip_validate, expiry: Time.now + 1.week) 
+0

इस समस्या के साथ जाने का यह सबसे अच्छा तरीका है! –