Избегайте использования кода модуля верхнего уровня в модульном тестировании - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь выполнить модульное тестирование некоторого кода 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 будет поддельной. Куда я могу пойти не так?

...