Я пытаюсь провести модульное тестирование класса, который получен из base_class во внешнем модуле. В моей среде dev / test у меня нет доступа к этому внешнему модулю, что означает, что я должен каким-то образом смоделировать этот base_class.
Мой тестовый код находится в файле, отличном от кода, который я пытаюсь протестировать.
Проблема может быть обобщена следующим образом:
my_class.py
import external_module
class MyClass(external_module.ExternalClass):
def test_method(self):
return "successful"
test_my_class.py
import sys
import unittest
from unittest.mock import MagicMock
sys.modules['external_module'] = MagicMock()
from my_class import MyClass
class TestMyClass(unittest.TestCase):
def test_first(self):
my_class = MyClass()
result = my_class.test_method()
self.assertEqual(result, "successful")
if __name__ == '__main__':
unittest.main()
Результаты
При запуске test_my_class.py результат будет следующим:
AssertionError: <MagicMock name='mock.ExternalClass.test_method()' id='140272215184664'> != 'successful'
Очевидно, что так как external_module является ложным, даже MyClass становится экземпляромmock-object.
Похожие посты
Проблема аналогична описанной в Python mock: базовый класс-насмешка для наследования , но отличается тем, чтоbase_class из внешнего модуля.
Четный Как смоделировать базовый класс с библиотекой python mock демонстрирует некоторые сходства с моей проблемой, хотя решения не могут быть применены напрямую.
Попытки и сбои
Чтобы заставить импорт
import external_module
работать в my_class.py
sys.modules['external_module'] = MagicMock()
необходимо установить в test_my_class.py .
Хотя это приводит к тому, что external_module. * Становится экземпляром Mock.