python - पायथन के सबसे बेरहमी से परीक्षण करने के लिए कि एक चेतावनी कैसे फेंक दी गई है?




unit-testing exception-handling (3)

@ire_and_curses का answer काफी उपयोगी है और, मुझे लगता है, विहित। यहाँ एक ही काम करने का एक और तरीका है। इसके लिए माइकल फोम की उत्कृष्ट Mock लाइब्रेरी की आवश्यकता है

import unittest, warnings
from mock import patch_object

def isZero( i):
   if i != 0:
     print "OK"
   else:
     warnings.warn( "the input is 0!")
   return i

class Foo(unittest.TestCase):
    @patch_object(warnings, 'warn')
    def test_is_zero_raises_warning(self, mock_warn):
        isZero(0)
        self.assertTrue(mock_warn.called)

if __name__ == '__main__':
    unittest.main()

निफ्टी patch_object आपको warn विधि का मजाक patch_object देता है।

पाइथन में मेरा एक निम्न कार्य है और मैं इस बात का परीक्षण करना चाहता हूं कि यदि फ़ंक्शन को तर्क के रूप में 0 मिलता है, तो यह चेतावनी देता है। मैंने पहले से ही जोर लगाने की कोशिश की, लेकिन चूंकि मैंने चेतावनी नहीं दी है, इसलिए यह काम नहीं करता है।

def isZero(i):
    if i != 0:
        print "OK"
    else:
        warning = Warning("the input is 0!") 
        print warning
    return i

आप catch_warnings संदर्भ प्रबंधक का उपयोग कर सकते हैं। अनिवार्य रूप से यह आपको चेतावनी हैंडलर को नकली करने की अनुमति देता है, ताकि आप चेतावनी के विवरण को सत्यापित कर सकें। फुलर स्पष्टीकरण और नमूना परीक्षण कोड के लिए आधिकारिक डॉक्स देखें।

import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")
    # Trigger a warning.
    fxn()
    # Verify some things
    assert len(w) == 1
    assert issubclass(w[-1].category, DeprecationWarning)
    assert "deprecated" in str(w[-1].message)

पायथन 3.2 के साथ शुरू, आप बस assertWarns() विधि का उपयोग कर सकते हैं।

with self.assertWarns(Warning):
    do_something()




warnings