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

Cla*_*n L 6 python mocking python-unittest

我有一段代码,如下所示:

# file1.py
from module import Object

def method():
    o = Object("param1")
    o.do_something("param2")
Run Code Online (Sandbox Code Playgroud)

我的单元测试如下所示:

@patch("file1.Object")
class TestFile(unittest.TestCase):
    def test_call(self, obj):
        ...
Run Code Online (Sandbox Code Playgroud)

我可以obj.assert_called_with()在单元测试中验证是否使用某些参数调用了构造函数。是否可以验证是否obj.do_something使用某些参数进行了调用?我的直觉是否定的,因为模拟完全封装在对象中,但我希望可能有其他方法。

MrB*_*men 9

您可以这样做,因为参数被传递给模拟对象。
这应该有效:

@patch("file1.Object")
class TestFile:
    def test_call(self, obj):
        method()
        obj.assert_called_once_with("param1")
        obj.return_value.do_something.assert_called_once_with("param2")
Run Code Online (Sandbox Code Playgroud)

obj.return_valueObject实例(它是MagickMock具有Object规范的对象),并且do_something是使用给定参数调用的该对象中的另一个模拟。

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