2011-09-14 22 views
29

का उपयोग कर रेल में समावेशन सत्यापन मेरे पास मेरे ActiveRecord में निम्न सत्यापन है।मैं कैसे परीक्षण कर सकता हूं: RSpec

validates :active, :inclusion => {:in => ['Y', 'N']} 

मैं अपने मॉडल सत्यापन का परीक्षण करने के लिए निम्न का उपयोग कर रहा हूं।

should_not allow_value('A').for(:active) 
should allow_value('Y').for(:active) 
should allow_value('N').for(:active) 

क्या इसका परीक्षण करने के माध्यम से कोई क्लीनर और अधिक है? मैं वर्तमान में आरएसपीसी 2 और कंधे मैचर्स का उपयोग कर रहा हूं।

संपादित

चारों ओर देख मैं सिर्फ पाया, यह शायद एक 'ठीक है' इस परीक्षण की तरह, चाहिये और इस के लिए कुछ भी किसी को भी, जो इसे इसके लिए अपने स्वयं के कस्टम मिलान लिख सकते हैं की आवश्यकता है प्रदान नहीं करता है कुछ करने के बाद (और शायद इसे परियोजना में वापस योगदान दें)। चर्चाओं के कुछ लिंक जो घुसपैठ कर सकते हैं:

  • उपरोक्त को इंगित करने वाले लिंक। Link 1, Link 2

  • should_ensure_value_in_range यह एक क्या इस्तेमाल किया जा सकता करने के लिए करीब आता है, लेकिन केवल पर्वतमाला और न मानों की सूची स्वीकार करता है। कस्टम matcher इस पर आधारित हो सकता है।

    उदाहरण::

    it { should validate_inclusion_check_constraint_on :status, :allowed_values => %w(Open Resolved Closed) } 
    it { should validate_inclusion_check_constraint_on :age, :allowed_values => 0..100 } 
    

    मिलान

उत्तर

53

उपयोग shoulda_matchers

(shoulda-matchers के हाल के संस्करणों में कम से कम v2.7 के रूप में।0), आप कर सकते हैं:

expect(subject).to validate_inclusion_of(:active).in_array(%w[Y N]) 

यह परीक्षण करता है कि सत्यापन में स्वीकार्य मानों की सरणी इस spec से बिल्कुल मेल खाती है।

पहले के संस्करणों में,> = v1.4, shoulda_matchers इस वाक्य रचना का समर्थन करता है:

it {should ensure_inclusion_of(:active).in_array(%w[Y N]) } 
+0

यह जांचने के लिए कि यह अन्य मानों को अस्वीकार कर रहा है, आप कुछ ऐसा कर सकते हैं: 'यह {must_not allow_value ('? ') के लिए (: सक्रिय)}' - जैसा कि आपने कहा था, आप सभी संभावित मानों की जांच नहीं कर सकते हैं, लेकिन कर रहे हैं यह सभी अनुमत मूल्यों की जांच के अलावा उचित कवरेज की तरह लगता है। – bjnord

+0

आपके द्वारा संदर्भित किए गए कंधे_मैचर ** ** मूल रूप से बताए गए अनुसार काम करते हैं, यानी यह प्रदान किए गए सरणी में मानों को अस्वीकार नहीं करता है। [दस्तावेज़ीकरण देखें] (https://github.com/thoughtbot/shoulda-matchers#ensure_inclusion_of)। अच्छे उपाय के लिए, मैंने इसे रेल ऐप में परीक्षण किया और यह सही तरीके से काम करता है। –

+1

@ लार्सलेवी - टिप्पणी के लिए धन्यवाद। ऐसा लगता है कि उन्होंने 'disallows_value_outside_of_array? 'की जांच करने के लिए सत्यापन को बदल दिया है। पुराने https://github.com/thoughtbot/shoulda-matchers/blob/v1.2.0/lib/shoulda/matchers/active_model/ensure_inclusion_of_matcher.rb#L86 बनाम अब देखें https://github.com/thoughtbot/shoulda- matchers/blob/15abdf066732828034efea751c2937aa81d080fe/lib/shoulda/matchers/active_model/sure_inclusion_of_matcher.rb # L90 –

1

मैं जो करीब आ रहा है कुछ इस तरह का परीक्षण करने के लिए प्रयास करता (परियोजनाओं मैं पर काम कर रहा था में से एक में) एक कस्टम चाहिये मिलान पाया यह सुनिश्चित करने का प्रयास करता है कि एक डीबी बाधा है जो इसे बचाने की कोशिश करते समय उड़ाती है। मैं इस विचार का सार देने का प्रयास करूंगा। मैच? कार्यान्वयन की तरह कुछ करता है:

begin 
    @allowed_values.each do |value| 
     @subject.send("#{@attribute}=", value) 
     @subject.save(:validate => false) 
    end 
    rescue ::ActiveRecord::StatementInvalid => e 
    # Returns false if the exception message contains a string matching the error throw by SQL db 
    end 

मुझे लगता है कि अगर हम थोड़ा @subject.save कहना और रेल मान्यता को उड़ाने, हम झूठे लौट सकते हैं करते हैं, जब अपवाद स्ट्रिंग जो कुछ पास वास्तविक अपवाद त्रुटि संदेश से मेल खाता है शामिल करने के लिए ऊपर बदल जाते हैं।

मुझे पता है कि यह परियोजना में वापस योगदान करने के लिए बिल्कुल सही है, लेकिन मुझे लगता है कि यदि आप वास्तव में :inclusion सत्यापन का परीक्षण करना चाहते हैं तो कस्टम प्रोजेक्टर के रूप में अपनी परियोजना में शामिल करना एक बुरा विचार नहीं हो सकता है।

+0

मैं अपने खुद के जवाब यहाँ स्वीकार करेंगे के बाद से मैं और कुछ को खोजने के लिए नहीं कर पा रहे हैं, लेकिन कृपया कैसे की आलोचना करने के लिए स्वतंत्र महसूस उपर्युक्त समाधान विफल हो सकता है, या यदि यह करने से परेशान करने का भी बुरा विचार है। – jake

23

यदि आपके पास बूलियन वाई/एन की तुलना में परीक्षण करने के लिए अधिक तत्व हैं तो आप भी कोशिश कर सकते हैं।

it "should allow valid values" do 
    %w(item1 item2 item3 item4).each do |v| 
    should allow_value(v).for(:field) 
    end 
end 
it { should_not allow_value("other").for(:role) } 

इतना है कि यह परीक्षण है कि केवल निरंतर मानों की अनुमति है तुम भी एक निरंतर आप अपने मॉडल में परिभाषित किया है साथ %w() बदल सकते हैं।

CONSTANT = %w[item1 item2 item3 item4] 
validates :field, :inclusion => CONSTANT 

फिर परीक्षण:

it "should allow valid values" do 
    Model::CONSTANT.each do |v| 
    should allow_value(v).for(:field) 
    end 
end 
संबंधित मुद्दे