Я пытаюсь проверить успешный вызов конструктора моего класса, но он не записывается в мой объект Mock.Я использую библиотеки pytest
и pytest-mock
для модульного тестирования и макетирования соответственно.
Представьте, что у меня есть следующий класс в пакете cryptocurrency
в модуле transaction.py
:
class Transaction:
def __init__(self, test):
self.test = test
И следующий тест в другом пакете tests
в модуле test_transaction.py
:
def test_constructor(mocker):
mock_transaction = mocker.patch('cryptocurrency.transaction.Transaction',
autospec=True)
Transaction('123')
mock_transaction.assert_called_once()
Почему тест завершается неудачно с сообщением:
AssertionError: Expected 'Transaction' to have been called once. Called 0 times.
Разве Mock-объект не должен прослушивать инициализацию экземпляра класса и записывать его?
РЕДАКТИРОВАТЬ: я получил ответ на этот вопрос, но у меня есть еще один похожий сценарий, который до сих пор не 'т работа.Представьте, что у класса Transaction
также есть следующий метод:
@classmethod
def new_transaction(cls, test)
return cls(test)
и что это тест:
def test_new_transaction(mocker):
mock_transaction = mocker.patch('cryptocurrency.transaction.Transaction',
autospec=True)
Transaction.new_transaction('123')
mock_transaction.assert_called_once()
Я не могу заставить его работать.Я уже пытался изменить патч на __name__ + 'Transaction'
, как предложенный ответ, но он все еще не работает.Мне кажется, что мое первоначальное решение должно быть правильным, поскольку, хотя тест ссылается на определенный импорт Transaction
, метод new_transaction()
будет взаимодействовать с исходным Transactiion
в cryptocurrency.transaction.Transaction
.