rspec

2014-12-07 9 views
10

के साथ रूबी मॉड्यूल का परीक्षण करना मुझे इस विशेष मामले में SO/Google पर एक बुरा समय मिल रहा है। मेरे पास फ़ंक्शंस के साथ एक मॉड्यूल है और इनका उपयोग करने के लिए, आपको एक कक्षा बनाना है जिसमें मॉड्यूल शामिल/विस्तारित किया गया है, यदि आप उदाहरण विधियों या कक्षा विधियों को चाहते हैं।rspec

module A 
    def say_hello name 
    "hello #{name}" 
    end 

    def say_bye 
    "bye" 
    end 
end 

मैं इस मॉड्यूल का उपयोग rspec का उपयोग कैसे कर सकता हूं?

मेरे पास ऐसा कुछ है, और मुझे यकीन नहीं है कि मुझे यह कहां है कि मुझे कक्षा बनाना चाहिए और मॉड्यूल का विस्तार करना चाहिए।

describe A do 
    class MyClass 
    extend A 
    end 

    before(:each) { @name = "Radu" } 

    describe "#say_hello" do 
    it "should greet a name" do 
     expect(Myclass.say_hello(@name)).to eq "hello Radu" 
    end 
    end 
end 

धन्यवाद!

+1

आपका विधि इस मूल्य वापस नहीं करता। आपको यह जांचना चाहिए कि यह इसे रखता है, ताकि विधि 'डाल' को एक बार 'हेलो राडू' – zishe

+0

@zishe yep 'say_hello (@name)' return 'nil 'के साथ बुलाया जाता है। –

+1

यह एक मूर्ख उदाहरण था। मेरे पास ऐसी विधियां हैं जो चीजें वापस करती हैं। मेरी चिंता यह है कि rspec – radubogdan

उत्तर

24

आप अपने परीक्षण में एक गुमनाम वर्ग बना सकते हैं:

describe A do 
    let(:extended_class) { Class.new { extend A } } 
    let(:including_class) { Class.new { include A } } 

    it "works" do 
    # do stuff with extended_class.say_hello 
    # do stuff with including_class.new.say_hello 
    end 
end 

वास्तविक कोड में कुछ इसी तरह देखने के लिए, मैं testing my attr_extras lib के लिए इस रणनीति का उपयोग किया है।

उस ने कहा, include और extend रूबी की मानक विशेषताएं हैं, इसलिए मैं परीक्षण नहीं करता कि प्रत्येक मॉड्यूल दोनों शामिल होते हैं और विस्तार करते समय - आमतौर पर दिया जाता है।

यदि आप परीक्षण में नामांकित कक्षा बनाते हैं, जैसे आप अपने प्रश्न में करते हैं, तो मेरा मानना ​​है कि कक्षा आपके परीक्षण चलाने की अवधि के लिए वैश्विक स्तर पर मौजूद होगी। तो यह कक्षा आपके परीक्षण सूट के हर परीक्षण के बीच रिसाव होगी, संभावित रूप से कहीं भी संघर्ष पैदा कर सकती है।

यदि आप अज्ञात वर्ग बनाने के लिए let का उपयोग करते हैं, तो यह केवल इस विशेष परीक्षण के भीतर उपलब्ध होगा। इसमें कोई वैश्विक स्थिरता नहीं है जो अन्य परीक्षणों के साथ संघर्ष कर सकती है।

+0

मुझे अभी भी # <कक्षा: 0x007fbcd68917d8> 'के लिए' अपरिभाषित विधि 'my_method' मिलती है, लेकिन शायद मेरी गलती है । आपके त्वरित उत्तर के लिए धन्यवाद। – radubogdan

+0

@radubogdan मैंने एक मौजूदा आरएसपीईसी परीक्षण में [इस सटीक कोड (गिस्ट लिंक)] (https://gist.github.com/henrik/8d400883a99779de4926) चिपकाने का प्रयास किया और यह गुजरता है, तो शायद कुछ और गलत है? –

+0

हां, निश्चित रूप से कुछ और गलत है, लेकिन मुझे क्या नहीं मिल रहा है। Spec_helper हो सकता है? (मैंने rspec --init का उपयोग कर spec_helper बनाया, rspec संस्करण 3.1.7 है) – radubogdan

0

भविष्य पाठकों बाहर मदद करने के लिए, यहां एक उदाहरण मैं @ हेनरिक-एन के समाधान का उपयोग कर जा रहा हो गया है:

# slim_helpers.rb 
module SlimHelpers 

    # resourceToTitle converts strings like 'AWS::AutoScaling::AutoScalingGroup' 
    # to 'Auto Scaling Group' 
    def resourceToTitle(input) 
    input.split('::')[-1].gsub(/([A-Z])/, ' \1').lstrip 
    end 

end 

# slim_helpers_spec.rb 
require_relative '../slim_helpers' 

describe SlimHelpers do 

    # extended class 
    let(:ec) { Class.new { extend SlimHelpers } } 

    it "converts AWS resource strings to titles" do 
    out = ec.resourceToTitle('AWS::AutoScaling::AutoScalingGroup') 
    expect(out).to eq 'Auto Scaling Group' 
    end 
end 
+0

यदि आप कक्षा विधियों का परीक्षण करने की आवश्यकता है तो आप 'class.extend (SlimHelpers) 'का भी उपयोग कर सकते हैं। – czerasz

 संबंधित मुद्दे