Невозможно подменить переменную модуля патча в модульных тестах Python - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь проверить модуль:

пакет / module.py

DATA_PATH = os.path.join(os.path.dirname(__file__), "data")
class SomeClass:
    def __init__(self):
        self.filename = os.path.join(DATA_PATH, "ABC.txt")

в тестах / module_test.py Я пытаюсь сделать

from package import module
@patch("package.module.DATA_PATH", "data_path_here") # doesn't work
class TestSomeClass(unittest.TestCase):
    def setUp(self):
        module.DATA_PATH = "data_path_here" # doesn't work
        self.obj= SomeClass()

    @patch("package.module.DATA_PATH", "data_path_here") # doesn't work either
    def test_constructor(self):
        self.assertEqual(r"data_path_here\ABC.txt", self.obj.filename)

но DATA_PATH по-прежнему не отключен. Я думаю, что я перепробовал все возможные варианты для его макета, но он по-прежнему возвращает оригинальный путь вместо «data_path_here»

Что я делаю не так?

EDIT: Это не дубликат Изменение глобальных переменных в инфраструктуре юнит-тестов Python Потому что это решение не работает

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Для меня использование макета / патча - болезненное упражнение. С другой стороны, это было тривиально, установив (и восстановив) глобальное значение для тестов:

import mock_module

class TestSomeClass(unittest2.TestCase):
    def setUp(self):
        self._original = mock_module.DATA_PATH
        mock_module.DATA_PATH = 'data_path_here'

    def tearDown(self):
        mock_module.DATA_PATH = self._original

    def test_constructor(self):
        obj = mock_module.SomeClass()
        self.assertEqual(r"data_path_here\ABC.txt", obj.filename)

Обратите внимание, что для моего соединения с OS путь, разделитель \, но ваше использование может отличаться.

Пробежал 1 тест за 0,005 с

OK

0 голосов
/ 01 мая 2018

Вам не нужно вносить исправления, поскольку вы используете глобальную переменную из другого модуля:

#module.py

DATA_PATH = 1

def getData():
    return DATA_PATH


#tests.py
from package import module

print(module.DATA_PATH, module.getData())
module.DATA_PATH = 2
print(module.DATA_PATH, module.getData())

Выход:

1 1
2 2
...