【发布时间】:2021-11-21 20:43:28
【问题描述】:
我的源文件中有这样的东西
# code.py
def some_func():
# doing some connections and stuff
return {'someKey': 'someVal'}
class ClassToTest:
var = some_func()
我的测试文件如下所示...我正在尝试模拟 some_func,因为我想避免创建连接。
# test_code.py
from src.code import ClassToTest
def mock_function():
return {"someOtherKey": "someOtherValue"}
class Test_Code(unittest.TestCase):
@mock.patch('src.code.some_func', new=mock_function)
def test_ClassToTest(self):
self.assertEqual(ClassToTest.var, {"someOtherKey": "someOtherValue"})
但这不起作用。另一方面,如果var 是一个即时变量模拟工作正常。我猜这是由于类变量在导入期间被初始化。如何在 var 初始化之前正确模拟 some_func?
【问题讨论】:
-
如果你在修补函数内部进行导入会怎样?
-
你是说在
test_ClassToTest里面?那也不行。 -
嗯,我猜你还没导入就不能打补丁。我的看法是,您可能想重新考虑在类初始化时(因此在导入时)发生连接逻辑,并改用单例模式。
-
在导入时不要做“一些连接和东西”。如您所见,它使测试代码变得困难。
-
您应该同时编写测试和代码,这有助于您以可测试的方式开发代码。编写一些测试来覆盖已经存在且无法更改的代码并没有多大意义——这有点忽略了测试的意义。
标签: python python-3.x mocking python-unittest class-variables