Python Mocking assert_called不起作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python Mocking assert_called不起作用相关的知识,希望对你有一定的参考价值。
我能够成功模拟一个函数,我确信原来没有被调用。我在原始函数中添加了一个巨大的print语句,当我模拟它时,不会调用此print。当我重新打开模拟时,不会调用print语句。
但是,我的assert_called未能说它从未被调用过。有没有人经历过这样的事情?
class FooTestCase(unittest.TestCase):
@mock.patch('MyObj.helper_function')
def test_simple(self, mock_hf):
my_obj = MyObj()
# internally, this class imports HelperModule
# and the method calls helper_function
my_obj.do_something()
mock_hf.helper_function.assert_called()
return
我的错误回复
AssertionError: Expected 'helper_function' to have been called.
更新我刚刚在断言之前添加了以下行
print mock_cw.method_calls
print mock_cw.mock_calls
method_calls是一个空列表,而mock_calls是一个包含1个项目的列表
[call(arg1_expected_for_helper_fn, arg2_expected_for_helper_fn)]
然而断言仍然失败
通常这样的错误是不修补正确位置的结果。尝试使用以下方法修补对象本身:
@patch.object(MyObj, "helper_function")
def test_simple(mock_hf):
...
由于MyObj(假设是)在测试文件的顶部导入,因此可以直接在该对象上修补该方法。
问题是我正在检查mock_hf.helper_function
是否被调用,但mock_hf
已经映射到helper_function
。我或多或少地检查helper_function.helper_function
被召唤而不仅仅是helper_function
。
断言行必须是mock_hf.assert_called()
我看到原来的海报已经做到了这一点,但对于其他任何绊倒这个的人都像我一样......
不要忘记你需要在call
对象中包装预期的调用,例如
mock_logger.assert_has_calls([call(expected_log_message_1), call(expected_log_message_2)])
如果你不这样做,它会抱怨预期的呼叫没有发生,你会花费多年时间比较输出,试图找出原因(就像我做的那样!)。
以上是关于Python Mocking assert_called不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Mockito一个采用Java编写用于单元测试的Mocking框架
在 Restcontroller 的单元测试期间,我的 Mocking 类不起作用
c# mocking IFormFile CopyToAsync() 方法