不能在Python单元测试中使用补丁模块变量

时间:2018-05-01 12:52:50

标签: python unit-testing mocking monkeypatching

我正在尝试测试模块:

包/ 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”

我做错了什么?

编辑: 它不是Modifying global variables in Python unittest framework的副本 因为该解决方案不起作用

2 个答案:

答案 0 :(得分:1)

由于您使用的是另一个模块的全局变量,因此您不需要修补:

#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

答案 1 :(得分:1)

对我来说,使用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路径连接,分隔符是\但您的使用可能会有所不同。

  

以0.005s进行1次试验