我的源文件中有类似的内容
# 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
是一个即时变量,mock可以正常工作。我猜这是由于类变量在导入过程中被初始化。在var
被初始化之前,我如何正确地模拟some_func
导入
code.py
时,还没有激活的修补程序,因此ClassToTest.var
初始化时,它使用原始的some_func
。只有到那时src.code.some_func
的补丁才会生效,现在显然为时已晚解决方案1
您可以做的是修补
some_func
,然后重新加载code.py
,以便它重新初始化ClassToTest
,包括其属性var
。因此,由于我们在重新加载code.py
时已经有了一个活动补丁,那么ClassToTest.var
将被设置为补丁值some_func
移动到另一个文件,然后导入它李>src/code.py
src/other.py
测试代码.py
输出
解决方案2
如果您不希望在测试期间调用真正的
some_func
,那么仅仅重新加载是不够的。需要做的是永远不要导入包含ClassToTest
的文件,也不要导入任何会间接导入它的文件。仅在some_func
的活动修补程序已建立后导入它相关问题 更多 >
编程相关推荐