Python: во время модульного теста замените импорт другого модуля перед его использованием

У меня есть модуль, который:

  1. Импортирует класс
  2. Создает экземпляр класса + использует его

Я хотел бы заменить этот класс другим классом перед созданием / использованием.

Как это может быть сделано?


Вот аналог моего варианта использования.

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

0 ответов

Другие вопросы по тегам