Инициализация ложного объекта не записывается - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь проверить успешный вызов конструктора моего класса, но он не записывается в мой объект 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.

...