Python模拟-检查是否在模拟对象中调用了方法

Python模拟-检查是否在模拟对象中调用了方法,python,mocking,python-unittest,Python,Mocking,Python Unittest,我有一段代码如下所示: # file1.py from module import Object def method(): o = Object("param1") o.do_something("param2") @patch("file1.Object") class TestFile(unittest.TestCase): def test_call(self, obj): ...

我有一段代码如下所示:

# file1.py
from module import Object

def method():
    o = Object("param1")
    o.do_something("param2")
@patch("file1.Object")
class TestFile(unittest.TestCase):
    def test_call(self, obj):
        ...
我有这样的单元测试:

# file1.py
from module import Object

def method():
    o = Object("param1")
    o.do_something("param2")
@patch("file1.Object")
class TestFile(unittest.TestCase):
    def test_call(self, obj):
        ...

我可以在unittest中使用调用的obj.assert_来验证是否使用某些参数调用了构造函数。是否可以验证obj.do_something是否使用某些参数调用?我的直觉是否定的,因为Mock完全封装在对象中,但我希望有其他方法。

当你模拟对象时,它也会模拟对象内部的方法。因此,您可以看到obj.do_something是否已使用某些参数调用,如obj.do_something.assert_调用的参数

有关单元测试模拟的更多信息,请访问python库wiki

在该wiki源中存在一个完美的示例来说明您的问题:

>>> mock = Mock()
>>> mock.method(1, 2, 3, test='wow')
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called_with(1, 2, 3, test='wow')

当你模拟一个对象时,它也会模拟对象内部的方法。因此,您可以看到obj.do_something是否已使用某些参数调用,如obj.do_something.assert_调用的参数

有关单元测试模拟的更多信息,请访问python库wiki

在该wiki源中存在一个完美的示例来说明您的问题:

>>> mock = Mock()
>>> mock.method(1, 2, 3, test='wow')
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called_with(1, 2, 3, test='wow')

您可以这样做,因为参数是传递给模拟对象的。 这应该起作用:

@patchfile1.Object 类测试文件: def test_callself,obj: 方法 obj.assert_用param1调用了一次 obj.return_value.do_something.assert_调用_once__,带参数2 返回值是对象实例,它是具有对象规范的MagickMock对象,而do_something是该对象中使用给定参数调用的另一个模拟

只要您只是将参数传递给mock对象,mock就会记录这一点,您可以检查它。您没有的是实际函数调用的任何副作用-因此,如果最初的do_something将调用另一个函数,则无法检查

编辑:
我没有正确地阅读另一个答案——它也正确地回答了问题。因此,这更多的是对答案的修正…

您可以这样做,因为参数被传递给mock对象。 这应该起作用:

@patchfile1.Object 类测试文件: def test_callself,obj: 方法 obj.assert_用param1调用了一次 obj.return_value.do_something.assert_调用_once__,带参数2 返回值是对象实例,它是具有对象规范的MagickMock对象,而do_something是该对象中使用给定参数调用的另一个模拟

只要您只是将参数传递给mock对象,mock就会记录这一点,您可以检查它。您没有的是实际函数调用的任何副作用-因此,如果最初的do_something将调用另一个函数,则无法检查

编辑:
我没有正确地阅读另一个答案——它也正确地回答了问题。所以这是对答案的修正…

你试过了吗:obj.do\u something.assert\u调用了什么?我试过了。它说它从来没有被调用过,我相信这是真的,因为obj是对导入对象的引用,Object.do\u something从来没有被调用过。你尝试过:obj.do\u something.assert\u调用过吗?我尝试过。它说它从未被调用过,我相信这是真的,因为obj是对导入对象的引用,Object.do_从未调用过某个对象。这不起作用,它说它从未被调用过。我认为这是因为调用obj.do_something相当于调用file1中的Object.do_something,但没有发生。您是否尝试将修补程序放置在测试函数而不是类中?这不起作用,因为它从未被调用过。我认为这是因为调用obj.do_something相当于调用file1中的Object.do_something,但这并没有发生。您是否尝试过将补丁放在测试函数而不是类中?很好,就是这样。这里的关键部分是引用obj.return\u值,这是我没有想到的。这里的关键部分是引用obj.return\u值,这是我没有想到的。