无法在 Python 单元测试中猴子补丁模块变量
Cannot monkey patch module variable in Python unit tests
我正在尝试测试模块:
package/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 仍然没有模拟出来。我认为我尝试了所有可能的选项来模拟它,但它仍然是 returns 原始路径而不是 "data_path_here"
我做错了什么?
编辑:
它不是 Modifying global variables in Python unittest framework 的副本
因为该解决方案不起作用
您不需要修补,因为您正在使用来自另一个模块的全局变量:
#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
对我来说,使用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)
请注意,对于我的 os 路径连接,分隔符是 \ 但您的用法可能不同。
Ran 1 test in 0.005s
OK
我正在尝试测试模块:
package/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 仍然没有模拟出来。我认为我尝试了所有可能的选项来模拟它,但它仍然是 returns 原始路径而不是 "data_path_here"
我做错了什么?
编辑: 它不是 Modifying global variables in Python unittest framework 的副本 因为该解决方案不起作用
您不需要修补,因为您正在使用来自另一个模块的全局变量:
#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
对我来说,使用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)
请注意,对于我的 os 路径连接,分隔符是 \ 但您的用法可能不同。
Ran 1 test in 0.005s
OK