Python: во время модульного теста замените импорт другого модуля перед его использованием
У меня есть модуль, который:
- Импортирует класс
- Создает экземпляр класса + использует его
Я хотел бы заменить этот класс другим классом перед созданием / использованием.
Как это может быть сделано?
Вот аналог моего варианта использования.
thread_import.py
from threading import Thread
def foo() -> None:
pass
def run_thread() -> Thread:
hello = Thread(target=foo, daemon=True)
hello.start()
hello.join()
return hello
test_thread_import.py
from threading import Thread
from typing import Optional
from unittest import TestCase
from unittest.mock import patch
from thread_import import run_thread
class ExcCatchingThread(Thread):
"""Thread that when run, its exception is caught.
SEE: https://stackru.com/questions/12484175/make-python-unittest-fail-on-exception-from-any-thread#12651449
"""
exc: Optional[Exception]
def run(self):
try:
Thread.run(self)
except Exception as exc:
self.exc = exc
else:
self.exc = None
class TestThreadImport(TestCase):
def test_run_thread(self) -> None:
planned_exc = Exception("Planned exc.")
with patch("thread_import.foo", side_effect=planned_exc):
thread = run_thread()
# how can I swap Thread in thread_import with ExcCatchingThread?
self.assertEqual(thread.exc, planned_exc)
Сделано с использованием Python 3.8.5