2010-06-28 5 views
9

मैं अपने मॉडल, उनमें से एक होने के परीक्षण के लिए चाहिये rspec matchers में से कुछ का उपयोग कर रहा बनाने के लिए:चाहिये rspec matchers: पर =>:

describe Issue do 
    it { should_not allow_value("test").for(:priority) } 
end 

इस के साथ मेरी समस्या यह है कि मेरे मॉडल में मेरी मान्यता इस तरह दिखता है:

validates_format_of :priority, :with => /^(Low|Normal|High|Urgent)$/, :on => :update 

तो मैं जब इस परीक्षण चलाने के:

1) 'Issue should not allow priority to be set to "test"' FAILED 
    Expected errors when priority is set to "test", got errors: category is invalid (nil)title can't be blank (nil)profile_id can't be blank (nil) 

सत्यापन ट्रिगर नहीं किया जा रहा है beca इसका उपयोग केवल एक अद्यतन पर चलता है, मैं एक बनाम बनाम एक अद्यतन पर इन कंधे matchers का उपयोग कैसे कर सकते हैं?

उत्तर

12

मुझे लगता है कि कंधे को इसे बेहतर तरीके से संभालना चाहिए। मैं इसमें भाग गया क्योंकि मैं केवल नए उपयोगकर्ता बनाते समय अपने उपयोगकर्ता मॉडल के लिए अपनी विशिष्टता सत्यापन जांच को चलाने के लिए चाहता हूं। यह अद्यतन पर यह कर एक डेटाबेस क्वेरी की बर्बादी है, क्योंकि मैं उपयोगकर्ता नाम परिवर्तित करने की अनुमति नहीं देते:

validates :username, :uniqueness => { :case_sensitive => false, :on => :create }, 

सौभाग्य से आप इस के आसपास स्पष्ट रूप से "विषय" को परिभाषित करते हुए प्राप्त कर सकते हैं:

describe "validation of username" do 
     subject { User.new } 
     it { should validate_uniqueness_of(:username) } 
    end 

इस तरह यह केवल एक नए उदाहरण पर परीक्षण कर रहा है। आपके मामले के लिए, आप शायद सभी आवश्यक फ़ील्ड सेट के साथ, डेटाबेस में पहले से सहेजे गए कुछ चीज़ को विषय में बदल सकते हैं।

+0

धन्यवाद @endium। इसी प्रकार, 'subject {FactoryGirl.create (: user)}' का उपयोग ':: अद्यतन '-केवल सत्यापनों का परीक्षण करने के लिए किया जा सकता है। – scarver2