Я пытаюсь выполнить модульное тестирование некоторого кода Python 3, который импортирует модуль. К сожалению, способ написания модуля, простой импорт его, имеет неприятные побочные эффекты, которые не важны для тестов. Я пытаюсь использовать unitest.mock.patch
, чтобы обойти это, но без особой удачи.
Вот структура иллюстративного примера:
.
└── work
├── __init__.py
├── test_work.py
├── work.py
└── work_caller.py
__init__.py
- пустоефайл
work.py
import os
def work_on():
path = os.getcwd()
print(f"Working on {path}")
return path
def unpleasant_side_effect():
print("I am an unpleasant side effect of importing this module")
# Note that this is called simply by importing this file
unpleasant_side_effect()
work_caller.py
from work.work import work_on
class WorkCaller:
def call_work(self):
# Do important stuff that I want to test here
# This call I don't care about in the test, but it needs to be called
work_on()
test_work.py
from unittest import TestCase, mock
from work.work_caller import WorkCaller
class TestWorkMockingModule(TestCase):
def test_workcaller(self):
with mock.patch("work.work.unpleasant_side_effect") as mocked_function:
sut = WorkCaller()
sut.call_work()
В work_caller.py
я хочу толькопроверить начальный код, а не вызов work_on()
. Когда я запускаю тест, я получаю следующий вывод:
paul-> python -m unittest
I am an unpleasant side effect of importing this module
Working on /Users/paul/src/patch-test
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Я ожидал, что строка I am an unpleasant side effect of importing this module
не будет напечатана, потому что функция unpleasant_side_effect
будет поддельной. Куда я могу пойти не так?