2012-06-03 12 views
22

मैं यह जांचना चाहता हूं कि कोई फ़ंक्शन मिनीटेस्ट रूबी के साथ अन्य कार्यों को ठीक से आमंत्रित करता है, लेकिन मुझे doc से परीक्षण करने के लिए उचित assert नहीं मिल रहा है।रूबी न्यूनतमतम ढांचे के साथ कुछ विधि को कैसे ज़ोर दिया जाता है?

स्रोत कोड
class SomeClass 
    def invoke_function(name) 
    name == "right" ? right() : wrong() 
    end 

    def right 
    #... 
    end 

    def wrong 
    #... 
    end 
end 
परीक्षण कोड:
describe SomeClass do 
    it "should invoke right function" do 
    # assert right() is called 
    end 

    it "should invoke other function" do 
    # assert wrong() is called 
    end 
end 

उत्तर

21

minitest आप expect विधि का उपयोग एक विधि के लिए अपेक्षा सेट के साथ इतना

obj = MiniTest::Mock.new 
obj.expect :right 

की तरह एक नकली वस्तु पर कहा जा यदि आप मानकों के साथ अपेक्षा निर्धारित करना चाहते हैं और मान वापस कराना चाहते हैं तो:

obj.expect :right, return_value, parameters 

और इसलिए की तरह ठोस वस्तु के लिए:

obj = SomeClass.new 
assert_send([obj, :right, *parameters]) 
+2

ठोस वस्तु संस्करण के लिए, वहाँ 'जब' minitest/spec' – Frost

+0

का उपयोग कर मुझे बताओ के लिए must_send' है अगर मुझे कुछ याद आ रहा है लेकिन मुझे लगता है कि नीचे @ jing-li द्वारा जवाब सही है कि 'assert_send' यहां उचित नहीं है। ओपी परीक्षण करना चाहता है कि 'invoke_function' कहलाए जाने पर' दाएं 'कहा जाता है। इसके अतिरिक्त, इस उत्तर के पहले भाग में मॉक ऑब्जेक्ट पर 'दाएं' कहा जाता है, यह सुनिश्चित करने के लिए 'obj.verify' की आवश्यकता है। इसे पढ़ने के लिए, कृपया सुनिश्चित करें कि आप उन्हें पास करने से पहले अपने परीक्षण विफल हो जाएं। – monozok

+0

मुझे लगता है कि assert_send का उपयोग करना एक सुरक्षित विकल्प नहीं है। दस्तावेज़ों के अनुसार: http://ruby-doc.org/stdlib-2.0.0/libdoc/minitest/rdoc/MiniTest/Assertions.html#method-i-assert_send –

9

Minitest अगर कुछ विधि कहा जाता है की जाँच के लिए एक विशेष .expect :call है।

describe SomeClass do 
    it "should invoke right function" do 
    mocked_method = MiniTest::Mock.new 
    mocked_method.expect :call, return_value, [] 
    some_instance = SomeClass.new 
    some_instance.stub :right, mocked_method do 
     some_instance.invoke_function("right") 
    end 
    mocked_method.verify 
    end 
end 

दुर्भाग्यवश यह सुविधा बहुत अच्छी तरह से प्रलेखित नहीं है। मैंने इसके बारे में यहां से पाया: https://github.com/seattlerb/minitest/issues/216

0

दिए गए उदाहरण के अनुसार, कोई अन्य प्रतिनिधि वर्ग नहीं है, और आप यह सुनिश्चित करना चाहते हैं कि विधि को उसी वर्ग से ठीक से बुलाया जाए। फिर नीचे दिए गए कोड का टुकड़ा काम करना चाहिए:

class SomeTest < Minitest::Test 
    def setup 
    @obj = SomeClass.new 
    end 

    def test_right_method_is_called 
    @obj.stub :right, true do 
     @obj.stub :wrong, false do 
     assert(@obj.invoke_function('right')) 
     end 
    end 
    end 

    def test_wrong_method_is_called 
    @obj.stub :right, false do 
     @obj.stub :wrong, true do 
     assert(@obj.invoke_function('other')) 
     end 
    end 
    end 
end 

विचार एक सरल सच मूल्य वापस लौट कर [method_expect_to_be_called] ठूंठ है, और ठूंठ ब्लॉक में जोर यह वास्तव में बुलाया जा रहा है और लौटने सच मूल्य । अन्य अप्रत्याशित विधि को रोकने के लिए बस यह सुनिश्चित करना है कि इसे नहीं कहा जा रहा है।

नोट: assert_send सही ढंग से काम नहीं करेगा। कृपया official doc देखें।

वास्तव में, बयान से नीचे पारित करेंगे, लेकिन यह अपेक्षा के अनुरूप काम कर रहा है मतलब यह नहीं है:

assert_send([obj, :invoke_function, 'right']) 
# it's just calling invoke_function method, but not verifying any method is being called