Я пишу unittest для класса, как показано ниже. Я пытаюсь подтвердить, правильно ли ведение журнала вызывается с патчем keystoneclient. Класс выглядит следующим образом. Проблема в том, что я не могу пройти через оператор for и никогда не могу получить доступ к LOGGER.warning или LOGGER.info даже после исправления 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)
Мои модульные тесты выглядят примерно так,
import unittest
from mock import patch, MagicMock
import MyClass
LOGGER = logging.getLogger('my_module')
@patch('MyClass.Client', autospec = True)
@patch('MyClass.CredentialManager', autospec = True)
class TestMyClass(unittest.TestCase):
def test_logger_warning(self,,mock_client, mock_cm):
with patch.object(LOGGER, 'warning') as mock_warning:
obj = MyClass()
mock_warning.assert_called_with('no abc')
Ошибка, которую я получаю, выглядит так.
for credential in abc.list():
AttributeError: 'tuple' object has no attribute 'list'
Поэтому даже после исправления CredentialManager с помощью autospect я получаю сообщение об ошибке в abc.list(). Мне нужно добраться до точки, где я могу протестировать LOGGER, но похоже, что это исправление не работает для list(). Как мне сделать так, чтобы эта ошибка исчезла и чтобы я мог пройти через статус for, чтобы я мог утверждать при регистрации?
if
s вfor
цикле не имеет смысла. Я могу подать ответ, но мне нужно точно понять, что нужно написать тест: в вашем случаеabc
не может бытьFalse
в цикле. - person Michele d'Amico   schedule 08.04.2015