Пытаюсь протестировать модуль:
пакет / 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")
в tests / 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"
Что я делаю неправильно?
Обновлено: Это не дубликат Изменение глобальных переменных в среде Python unittest Потому что это решение не работает
это не дубликат, потому что это решение не работает
Возможно, вы захотите подтвердить проблему прямой или обратной косой черты в тесте ... действительно ли путь разделен символом \ или / ?? Это сделало бы подход «назначения» в настройке работоспособным.
Патчить не нужно, так как вы используете глобальную переменную из другого модуля:
#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
это лучше и чище без насмешек.
замечательно, спасибо. Мне пришлось импортировать модуль и изменить значение модуля, как вы это сделали. например import module
и module.var = <some_val>
. from module import var
, а затем установка var = <some_val>
не привели к постоянным изменениям.
Когда вы используете from module import var
, а затем var = something
, вы используете только var
своего собственного модуля и не влияете на module.var
. Обязательная ссылка на Нед Батчелдер
Это должен быть правильный ответ, работает в моем случае!
Для меня использование mock / patch - болезненное занятие. С другой стороны, это было тривиально, установив (и восстановив) глобал для тестов:
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)
Обратите внимание, что для моего соединения пути к ОС разделителем является \, но ваше использование может отличаться.
Ran 1 test in 0.005s
OK
Возможный дубликат Изменение глобальных переменных в среде Python unittest