我有一个自定义异常处理函数,它允许打印错误消息,而不是在需要时引发异常。我想断言它是在边缘情况下调用的。
如果我在异常处理程序中引发异常, 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
答案 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)