我正在为如下所示的类编写unittest。我试图断言是否使用补丁keystoneclient正确地调用了日志记录。该类如下所示。问题是,我无法通过for语句,也无法到达记录器。警告或者记录器信息即使是在修补了CredentialManager之后。我对整个unittest和Mock都是新手,所以我可能对某些东西理解不清楚。在
from keystoneclient.v3.client import Client
from keystoneclient.v3.credentials import CredentialManager
import logging
LOGGER = logging.getLogger(__name__)
class MyClass(object):
def __init__(self):
...
def myfunc(self):
new_credentials = {}
client = Client(
username=self.username,
password=self.password,
auth_url=self.auth_url,
user_domain_name=self.user_domain_name,
domain_name=self.domain_name
)
abc = CredentialManager(client)
for credential in abc.list():
defg = str(credential.type)
(access, secret) = _anotherfunc(credential.blob)
if not defg:
LOGGER.warning('no abc')
if defg in new_credentials:
LOGGER.info('Ignoring duplate')
new_credentials[defg] = (access, secret)
我的单元测试看起来像这样
^{pr2}$我得到的错误看起来像这样。在
for credential in abc.list():
AttributeError: 'tuple' object has no attribute 'list'
因此,即使在用autospect修补CredentialManager之后,我还是会出错abc列表(). 我需要达到可以测试LOGGER的程度,但是这个补丁似乎不适用于list()。我应该如何消除这个错误,并且能够通过for语句,以便在日志中声明?在
这个答案要包括多少细节:
@patch
decorator作为堆栈应用,这意味着第一个decorator->最后一个mock参数CredentialManager().list()
返回包含空type
的内容,您应该使用mock_cm
来执行此操作obj.myfunc()
来测试:)代码:
导入单元测试 从mock import补丁,mock 导入MyClass
在所有补丁中使用
autospec=True
是一个很好的做法。在不管怎样,我想鼓励您将日志记录部分提取到一个方法中,并用一些假凭证来测试它:更简单、更好的设计:类似
^{pr2}$测试更简单,看起来更好。在
相关问题 更多 >
编程相关推荐