एक उदाहरण विधि का उपयोग करने के लिए नकली पैच का उपयोग करना


83

मैं एक जांगो ऐप का परीक्षण करते समय कुछ नकली करने की कोशिश कर रहा हूं जो कल्पनाशील नाम से मॉक टेस्टिंग लाइब्रेरी का उपयोग कर रहा है । मुझे लगता है कि यह काम करने के लिए काफी नहीं मिल रहा है, मैं यह करने की कोशिश कर रहा हूं:

models.py

from somelib import FooClass

class Promotion(models.Model):
    foo = models.ForeignKey(FooClass)
    def bar(self):
       print "Do something I don't want!"


test.py

class ViewsDoSomething(TestCase):
    view = 'my_app.views.do_something'

    def test_enter_promotion(self):
        @patch.object(my_app.models.FooClass, 'bar')
        def fake_bar(self, mock_my_method):
            print "Do something I want!"
            return True

        self.client.get(reverse(view))

मैं क्या गलत कर रहा हूं?


barवास्तव में एक "उदाहरण विधि" है, और इसका एकमात्र पैरामीटर है self। एक क्लास विधि होने के लिए, इसे पैरामीटर के साथ निर्धारित करने की आवश्यकता होगी cls, और जैसा कि कॉल करने योग्य होगा Promotion.foo()
cavaunpeu 19

: Patchable वस्तु इस तरह उद्धृत किए जाने की आवश्यकता @patch.object('my_app.models.FooClass', 'bar')
Lāsma

2
@cavaunpeu - नहीं (सिर्फ) के साथ मानकीकृत cls, लेकिन इससे भी महत्वपूर्ण बात (जब से selfऔर clsअजगर में कुछ भी विशेष नहीं है), के साथ सजाया@classmethod
dwanderson

जवाबों:


69

किट के उत्तर पर जोड़ने के लिए, एक 3 तर्क निर्दिष्ट करके patch.object()नकली वस्तु / विधि को निर्दिष्ट करने की अनुमति देता है। अन्यथा, एक डिफ़ॉल्ट MagicMockऑब्जेक्ट का उपयोग किया जाता है।

    def fake_bar(self):
        print "Do something I want!"
        return True

    @patch.object(my_app.models.FooClass, 'bar', fake_bar)
    def test_enter_promotion(self):
        self.client.get(reverse(view))
        # Do something I want!

नोट यदि आप मजाक वस्तु निर्दिष्ट करते हैं, तो डिफ़ॉल्ट है कि, MagicMock()है नहीं रह गया है समझौता वस्तु में पारित कर दिया - जैसे नहीं रह गया है:

def test_enter_promotion(self, mock_method):

लेकिन बदले:

def test_enter_promotion(self):

http://www.voidspace.org.uk/python/mock/patch.html#patch-object


मैं इस कार्यान्वयन को पसंद करता हूं। यह अधिक स्पष्ट है, खासकर यूनिट टेस्टिंग में शुरुआती लोगों के लिए।
डोरिशोमन

36

आह मैं उस पैच डेकोरेटर को लगाने के लिए उलझन में था। फिक्स्ड:

class ViewsDoSomething(TestCase):
    view = 'my_app.views.do_something'

    @patch.object(my_app.models.FooClass, 'bar')
    def test_enter_promotion(self, mock_method):
        self.client.get(reverse(view))

21
अब नकली और नकली कार्यान्वयन की विधि के बीच संबंध कहां बनाते हैं?
physicalattraction

@physicalattraction, कनेक्शन mock_methodपरीक्षण फ़ंक्शन को दिए गए तर्क द्वारा बनाया गया है । मैं अपने एक परीक्षण में इस तकनीक का उपयोग करने में सक्षम रहा हूं। यह उपयोगी है जब आप केवल सत्यापित करना चाहते हैं कि क्या नकली विधि को बुलाया गया था।
कल्याण वेदला

@ rcode74: परीक्षण विधि के अंदर (कुछ अन्य वस्तु) उदाहरण की विधि को कैसे पैच करें। उदा: my_method_to_be_tested (...): r = some_script.some_class (...); r.how_to_patch_this_method।
imsrgadich

1
@imsradadich, आप r.how_to_patch_this_method = MagicMock () जैसा कुछ करेंगे। आप मॉक ऑब्जेक्ट में व्यवहार कैसे असाइन करें यह देखने के लिए मैजिकमॉक प्रलेखन की जांच कर सकते हैं।
कल्याण वेदला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.