मैं अजगर के विकास के लिए काफी नया हूं और मुझे यकीन नहीं है कि यूनिट परीक्षण के लिए एक समारोह में नकली इंजेक्शन लगाने का सबसे अच्छा तरीका क्या होगा।
मेरा एक फंक्शन है जो दिखता है:
import exampleModule
def func():
ls = createList()
exampleModule.send(ls)
उपरोक्त कोड में मैं मजाक करना चाहता हूं exampleModule.send
तरीका।
क्या मुझे फ़ंक्शन के तर्क के रूप में विधि पास करनी चाहिए? पसंद:
def func(invokeMethod):
ls = createList()
invokeMethod(ls)
और यूनिट टेस्ट में मैं मॉक पास कर सकता हूं। लेकिन मैं नहीं चाहता कि आह्वानकर्ता आह्वान विधि निर्दिष्ट करे।
इसे करने का सही तरीका क्या है?
उत्तर:
जवाब के लिए 2 № 1आप उपयोग कर सकते हैं दिखावटी माइकल फॉर्ड द्वारा पुस्तकालय, जो कि पाइथन 3 का हिस्सा है। यह इस तरह के मॉकिंग को बहुत सुविधाजनक बनाता है। इसे करने का एक तरीका यह होगा:
>>> from mock import patch
>>> import exampleModule
>>>
>>> def func():
... ls = []
... exampleModule.send(ls)
...
>>> with patch("exampleModule.send") as send:
... func()
... assert send.called
यहां हम इसे एक संदर्भ प्रबंधक के रूप में उपयोग करते हैं। लेकिन तुम भी उपयोग ca patch
एक सज्जाकार के रूप में। लेकिन उपयोग करने के और भी तरीके हैं mock
और यह शायद आपकी सभी जरूरतों को मॉकिंग / स्टबिंग में पूरा करेगा।
उत्तर № 2 के लिए 1
पायथन प्रथम श्रेणी के नागरिकों के रूप में कार्यों का समर्थन करता है, इसलिए आप इकाई परीक्षण उद्देश्यों के लिए एक विधि के कार्यान्वयन को ओवरराइड कर सकते हैं।
यह दृष्टिकोण मूल रूप से आपको रास्ता दिखाता है।
class Foo
def thing_to_mock():
really_expensive_stuff()
def thing_to_test():
i = 1 + 2
thing_to_mock()
return i
class FooTest
def testingThingToTest():
def mocker():
pass
toTest = Foo()
toTest.thing_to_mock = mocker
# assert here
वैकल्पिक रूप से, पायथन 3.3 में आप उपयोग कर सकते हैं अंतर्निहित मॉकिंग समर्थन.