Assert_used_once_with 需要检查调用中的实例是否具有相同的信息

Win*_*ech 8 python mocking pytest python-unittest

我正在尝试使用来自unittest.mock的assert_used_once_with https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.assert_ Called_once_with

但我想检查是否已通过正确的属性传递了两个对象实例。

所以在类中我重写了__eq__func:

    def __eq__(self, other):
        return (
            self.id == other.id
            and self.users == other.users
        )
Run Code Online (Sandbox Code Playgroud)

在我这样使用的代码中

        mock_add_user.assert_called_once_with(context_fix, expected_user_obj1, expected_user_obj2, users)

Run Code Online (Sandbox Code Playgroud)

但我不断收到错误,并且测试人员不断比较实例的 repr,如下所示

<app.domain.model.load_md.Load object at 0x10cb7d7d0>
Run Code Online (Sandbox Code Playgroud)
<app.domain.model.load_md.Load object at 0x10cb7d7d0>
Run Code Online (Sandbox Code Playgroud)

我确实需要一种方法来断言对象的实例是否已作为填充了正确属性的函数的参数传递。

Tib*_*ács 6

您想使用模拟对象的call_args属性:

from unittest.mock import ANY, Mock

class Foo:
    pass

def call(add_user):
    f = Foo()
    add_user(f)

def test_is_instance():
    mock_add_user = Mock()

    call(mock_add_user)

    # expected = Foo()
    # mock_add_user.assert_called_once_with(expected) # This would fail
    mock_add_user.assert_called_once_with(ANY)
    assert isinstance(mock_add_user.call_args.args[0], Foo)
Run Code Online (Sandbox Code Playgroud)

这是一个稍微复杂一些的例子,带有argskwargs断言:

from unittest.mock import ANY, Mock

class Foo:
    pass

class Bar:
    pass

def call(add_user):
    f = Foo()
    b = Bar()
    add_user(f, bar=b)

def test_is_instance():
    mock_add_user = Mock()

    call(mock_add_user)

    mock_add_user.assert_called_once_with(ANY, bar=ANY)
    assert isinstance(mock_add_user.call_args.args[0], Foo)
    assert isinstance(mock_add_user.call_args.kwargs["bar"], Bar)
Run Code Online (Sandbox Code Playgroud)