ruby on rails - फैक्ट्री-गर्ल बनाता है जो मेरे मॉडल सत्यापन को बाईपास करता है




ruby-on-rails ruby-on-rails-3 (5)

मैं समूह के लिए अपने मॉडल / यूनिट परीक्षण में दो उदाहरण बनाने के लिए फैक्टरी गर्ल का उपयोग कर रहा हूं। मैं यह जांचने के लिए मॉडल का परीक्षण कर रहा हूं कि .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

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


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


आपके कारखानों को डिफ़ॉल्ट रूप से वैध वस्तुओं को बनाना चाहिए। मैंने पाया कि इस तरह सशर्त तर्क जोड़ने के लिए क्षणिक विशेषताओं का उपयोग किया जा सकता है:

transient do
  skip_validations false
end

before :create do |instance, evaluator|
  instance.save(validate: false) if evaluator.skip_validations
end

आपके परीक्षण में:

create(:group, skip_validations: true)

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

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

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

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

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

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

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

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

संपादित करें:

जैसा कि संदर्भित धागे में उल्लिखित है, और अन्य टिप्पणियों / समाधानों से, आप शायद अपने परीक्षणों में भ्रम / मुद्दों से बचने के लिए इसे एक विशेषता ब्लॉक में लपेटना चाहते हैं; उदाहरण के लिए, जब आप अपने सत्यापन का परीक्षण कर रहे हैं।


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