Как проверить класс python, который вызывает отсутствующий модуль? - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь протестировать класс python с помощью pytest. У меня есть python модуль, подобный так:

import module_A
from module_b import module_c

class classToTest():
    def foo():
        return module_c.func() + 1

    def bar():
        return module_A.func() + 2

Итак, как правильно протестировать функцию bar (), если у меня нет модулей, импортированных в приведенном выше примере? Я решил смоделировать патч module_A.fun c (), но патченный объект должен быть импортирован раньше. Я создал поддельный module_A локально и сделал так:

import module_A
from mock import patch
@patch(‘module_A.func’, return_value=10)
def test_bar()
    MyClass = ClassToTest()
    assert MyClass.bar() == 12

У меня ошибка импорта, потому что у меня не установлен module_b. Как это решить? Возможно, лучше реорганизовать код, чтобы сделать его более тестируемым, или я должен использовать другие подходы для создания хорошего теста?

1 Ответ

0 голосов
/ 10 марта 2020

что-то вроде этого может помочь, но вы должны расположить его до вашего импорта того, что содержит classToTest.

import sys
try:
    import module_b

except (ImportError,) as e: 

    from unittest.mock import Mock

    module_b = Mock()
    module_b.module_c = module_b

    def func():
        return 10

    module_b.func = func

    sys.modules["module_b"] = module_b

#import your code under test

С self.assertEqual(classToTest().foo(), 12) Я получил ошибку, что 11 <> 12, он не был доволен числом, не совпадающим, поэтому поддельный module_b был принят.

Обратите внимание, я только играл с подделкой импорта module_b. Как указывало Code-Apprentice, у всей тестовой структуры, вероятно, есть проблемы.

2-е предупреждение: я бы не стал делать это, чтобы каким-то образом подделать установленный module_b, который не был установлен. system.modules, как только в нем будет зарегистрирована эта насмешка, нужно будет привести в порядок. reload должен это сделать, но кто знает? в этом случае обычный mock/patch может дать лучшие результаты.

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