Не умеет издеваться над методом - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть этот код, который я хочу протестировать в отдельности в some_module.py

import tarfile
def function_to_test(path_to_tar):
    tar_file = tarfile.open(path_to_tar)
    for tar_info in tar_file.getmembers():
        #some logic to test
        pass

И я не могу эффективно смоделировать методы tarfile, чтобы я мог имитировать файл tar без необходимости читать из фактическогофайл, моя текущая попытка выглядит следующим образом

from unittest.mock import patch, Mock

def test_DeepLabModel_unexistent_error():
    tar_path = "/path/to/nowhere"

    import tarfile

    with patch.object(tarfile, 'open', autospec=True) as open_mock:
        open_mock.getmembers = Mock()
        open_mock.getmembers.return_value = ['a','b']

        from some_module import function_to_test
        function_to_test(tar_path)
        pass

Это не работает, вызов метода getmembers в методе test просто возвращает другой объект MagicMock, а не список строк, которые я предоставляю, таким образомне повторять как следует.Я достиг своей цели, используя подобное поведение в прошлом, но я не могу понять, почему это не работает здесь.

1 Ответ

0 голосов
/ 19 сентября 2018

Вам не хватает return_value между open_mock и getmembers.После того, как вы определили свой макет, вы должны сказать, что этот метод будет возвращать. Это - это то, что вы будете называть getmembers в методе, который вы тестируете.Ваш тест будет выглядеть так:

import tarfile
from unittest.mock import patch, Mock
from some_module import function_to_test

def test_DeepLabModel_unexistent_error():
    tar_path = "/path/to/nowhere"

    with patch.object(tarfile, 'open', autospec=True) as open_mock:
        open_mock.return_value.getmembers.return_value = ['a','b']
        get_members(tar_path)

Обратите внимание, что я также перенес импорт в верхнюю часть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...