我正在Python中进行一系列单元测试,其中一些测试取决于配置变量的值。这些变量存储在全局Python配置文件中,并在其他模块中使用。我想为配置变量的不同值编写单元测试,但还没有找到实现这一点的方法。
我不可能重写我正在测试的方法的签名。
这就是我想要实现的目标:
from my_module import my_function_with_global_var
class TestSomething(self.unittest):
def test_first_case(self):
from config import MY_CONFIG_VARIABLE
MY_CONFIG_VARIABLE = True
self.assertEqual(my_function_with_global_var(), "First result")
def test_second_case(self):
from config import MY_CONFIG_VARIABLE
MY_CONFIG_VARIABLE = False
self.assertEqual(my_function_with_global_var(), "Second result")
谢谢。
编辑:使示例代码更加明确。
您可能想要模拟那些全局变量。这样做的好处是,一旦完成,全局变量就会被重置。Python附带了一个嘲讽模块,可以让您做到这一点。
unittest.mock.patch
用作装饰器:
class TestSomething(self.unittest):
@patch('config.MY_CONFIG_VARIABLE', True)
def test_first_case(self):
self.assertEqual(my_function_with_global_var(), "First result")
您也可以将其用作上下文管理器:
def test_first_case(self):
with patch('config.MY_CONFIG_VARIABLE', True):
self.assertEqual(my_function_with_global_var(), "First result")
如果可以的话,请使用@Flimm的答案中的unittest.mock.patch
。
原始答案
不要这样做:
from my_module import my_function_with_global_var
但是这个:
import my_module
然后,您可以将MY_CONFIG_VARIABLE
注入到导入的my_module
中,而无需像那样更改测试中的系统
class TestSomething(unittest.TestCase): # Fixed that for you!
def test_first_case(self):
my_module.MY_CONFIG_VARIABLE = True
self.assertEqual(my_module.my_function_with_global_var(), "First result")
def test_second_case(self):
my_module.MY_CONFIG_VARIABLE = False
self.assertEqual(my_module.my_function_with_global_var(), "Second result")
我在回答"如何模拟pyunit的stdin输入?"时做了类似的操作。
您的代码将MY_CONFIG_VARIABLE
导入到本地作用域,然后立即用不同的对象覆盖名称。这不会改变config
模块中的值。尝试
import config
config.MY_CONFIG_VARIABLE = False
相反。