我的理解是,autospec
这里使用的最简单的形式将检查正在模拟的函数的签名与提供的参数。其目的是在它们不匹配时引发错误。在下面的代码中,它似乎注入了一个额外的参数——对象本身。为什么使用模拟模块会autospec
导致此处显示的意外行为?对于这个问题,我在模块中创建了一个简化版本simplebutton
。当它作为主模块运行时,会打印“这不是开玩笑”这一行。
#module simplebutton
import sys
class _Dialog2:
def callback(self):
print("It's no joke")
def main():
dialog = _Dialog2()
dialog.callback()
if __name__ == '__main__':
sys.exit(main())
测试模块test_simplebutton
包含两个测试都有效。两者都模拟了该callback
功能。然而,第二个测试包括autospec=True
.
@unittest.mock.patch('simplebutton._Dialog2.callback',
name='callback', autospec=True)
在这个测试中,应该不带参数调用的回调函数必须用参数调用,dialog
否则测试失败。
编辑: 每个人都知道您不是通过调用方法method(instance)
而是通过调用方法instance.method()
。那是我的错误。在这里,它需要是模拟在instance1.method('instance2')
哪里,并且是包含模拟方法的对象。感谢 Michele d'Amico。instance1
instance2
mock_callback.assert_called_once_with(dialog)
测试套件如下:
#module test_simplebutton
import unittest
import unittest.mock
import simplebutton
class Test_Dialog(unittest.TestCase):
@unittest.mock.patch('simplebutton._Dialog2.callback',
name='callback')
def test_direct_call_to_callback_by_mocking_1(self, mock_callback):
dialog = simplebutton._Dialog2()
dialog.callback()
mock_callback.assert_called_once_with()
@unittest.mock.patch('simplebutton._Dialog2.callback',
name='callback', autospec=True)
def test_direct_call_to_callback_by_mocking_2(self, mock_callback):
dialog = simplebutton._Dialog2()
dialog.callback()
mock_callback.assert_called_once_with(dialog)