Экстракт проблемы выкладываю:
модуль main.py:
import long_time_module as l def main(): print('Executing main function') def optional(): l.ltc.print_ok() if __name__ == '__main__': main() optional()
модуль long_time_module.py:
class LongTimeExecutingClass(): def __init__(self) -> None: print('LongTimeExecutingClass - Long, Long init') def print_ok(self)->None: print ('LongTimeExecutingClass - print ok') ltc = LongTimeExecutingClass()
модуль tests.py:
from unittest import TestCase from unittest.mock import patch class MyClass(): def __init__(self) -> None: print('Mocking init') def print_ok(self) -> None: print ('Mocking class - print ok') class TestAll(TestCase): @patch('main.l.ltc', MyClass(), spec=False) def test_main(self): import main main.main() main.optional() assert True
Сейчас при запуске загружается модуль main, из него тянется long_time_module и срабатывает LongTimeExecutingClass.__init__ метод. После этого в тесте LongTimeExecutingClass подменяется MyClass и дальше все работает правильно. Простое присвоение переменной в тесте:
def test_main(self): import main main.l.ltc = MyClass() main.main() main.optional() assert True
Можно ли заблокировать LongTimeExecutingClass.__init__ в тесте? Может быть, есть более правильные способы объявления переменной базы данных, что бы не было таких проблем?