单元测试:断言异常处理函数调用

时间:2018-05-09 13:51:58

标签: python unit-testing

我有一个自定义异常处理函数,它允许打印错误消息,而不是在需要时引发异常。我想断言它是在边缘情况下调用的。

如果我在异常处理程序中引发异常,

with pytest.raises(Exception)按预期工作。如果打印pytest.raises将失败断言。

我尝试修补异常处理程序并断言它已被调用,但断言失败,说它没有被调用。

def the_function(sth):
    try:
        do something with sth
    except Exception:
        exception_handler("err_msg", print=False)

def exception_handler(err_msg, print=False):
    if print is True:
        raise exception
    print(err_msg)

# in testcase file
class Test_the_function(unittest.TestCase):
        @patch('exception_handler_resides_here.exception_handler')
        def test_function_calls_exception_handler(self, mock):
            the_function(sth_bad)
            self.assertTrue(mock.called)

我测试了用于断言函数是否在另一个函数中被调用的语法。

对于我应如何处理此问题的任何帮助都将不胜感激。

  

编辑:   为了澄清,我试图测试the_function的性能,而不是是否可以调用exception_handler

1 个答案:

答案 0 :(得分:0)

  

切普纳是对的

这句话是正确的。

self.assertTrue(mock.called)

mock.called确实返回True / False

这显示了模拟是如何工作的。

import mock
mocked = mock.Mock()
mocked.methods.called
False
mocked.methods()
<Mock name='mock.methods()' id='139652693478928'>
mocked.methods.called
True

这是通过修补exception_handler来测试the_function。

import unittest
import mock
def handler_side_effect(sth):
    exception_handler("err_msg", to_print=True)


def the_function(sth):
    try:
        sth.pop()
    except Exception:
        exception_handler("err_msg", to_print=False)


def exception_handler(err_msg, to_print=False):
    if to_print is True:
        raise Exception('aaa')
    print(err_msg)


class Test_the_function(unittest.TestCase):

    @mock.patch('python2_unittests.test_called.exception_handler')
    def test_the_function(self, mocked_handler):
        # no exception
        the_function([1])
        self.assertFalse(mocked_handler.called)

        # with exception, but will not be raised
        the_function(None)
        self.assertTrue(mocked_handler.called)

        # force to trigger a raise Exception
        mocked_handler.side_effect = handler_side_effect
        with self.assertRaises(Exception):
            the_function(None)