模拟的补丁属性 class
Patch attribute of mocked class
我正在尝试模拟 class。
我试图模拟的 class 看起来像下面这样(为简洁起见,删除了几行):
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
,但我只需要能够设置即可。)
使用当前代码,我的应用程序 returns 错误:
AttributeError: 'Connection' object has no attribute 'clients'
谢谢!
您可能想要修补 Connection
class 本身,而不是 __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
class,并通过设置 return_value
设置 Connection
实例模拟。现在您可以在该实例中设置所需的属性。
请注意,检查 __init__
调用实际上意味着检查实例创建调用,因此您可以为此使用 Connection
模拟。
当然,这是假设您不想测试 Connection
本身,并且 _auth
属于另一个 class(这里称为 Auth
) .
我正在尝试模拟 class。
我试图模拟的 class 看起来像下面这样(为简洁起见,删除了几行):
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
,但我只需要能够设置即可。)
使用当前代码,我的应用程序 returns 错误:
AttributeError: 'Connection' object has no attribute 'clients'
谢谢!
您可能想要修补 Connection
class 本身,而不是 __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
class,并通过设置 return_value
设置 Connection
实例模拟。现在您可以在该实例中设置所需的属性。
请注意,检查 __init__
调用实际上意味着检查实例创建调用,因此您可以为此使用 Connection
模拟。
当然,这是假设您不想测试 Connection
本身,并且 _auth
属于另一个 class(这里称为 Auth
) .