模拟类的补丁属性

时间:2020-06-26 04:52:54

标签: python python-3.x pytest magicmock pytest-mock

我正在尝试模拟一个类。

我尝试模拟的类如下所示(为简洁起见,删除了行):

class Connection(object):
    """Connection.
    """

    def __init__(self, base_url=None, creds=None, user_agent=None):
        self.clients = ClientFactory(self)

如您所见,它具有一个名为clients的属性。

我的测试方法:

    def _auth(self, credentials):
        connection = Connection(base_url=f'https://someurl.com', creds=credentials)

        return connection.clients

我的单元测试如下:

@patch('connection.Connection.__init__')
def test_deploy(patched_connection, fs):
    patched_connection.return_value = None
    patched_connection.clients = None

    # Do some stuff

问题是...由于要测试的方法要求设置clients属性,我该如何在测试中设置它? (我可以将其设置为None,但我只需要设置它即可。)

使用当前代码,我的应用程序返回错误:

AttributeError: 'Connection' object has no attribute 'clients'

谢谢!

1 个答案:

答案 0 :(得分:2)

您可能想修补Connection类本身,而不是__init__方法:

@patch('connection.Connection')
def test_deploy(patched_connection, fs):
    connection_object = MagicMock()
    patched_connection.return_value = connection_object
    connection_object.clients = None
    sut = Auth()  # create the tested object (Auth is a placeholder here)
    sut._auth('')  # call the tested function

    # test for how `Connection` was constructed 
    patched_connection.assert_called_once_with(
        base_url='https://someurl.com', creds='')

您修补Connection类,并通过设置return_value来设置Connection实例模拟。现在,您可以在该实例中设置所需的属性。

请注意,检查__init__调用实际上意味着检查实例创建调用,因此您可以使用Connection模拟。

当然,这是假定您不想测试Connection本身,并且_auth属于另一个类(这里称为Auth)。