如何修补在函数外部实例化的对象以在每个测试中重用 python
How to patch an object instantiated outside of a function to reuse in every test python
我有一个模块,我在我的函数之外实例化了一个对象,所以我可以重用它:
from somewhere import client
client_obj = client()
def function_with_client1():
client_obj.foo1()
def function_with_client2()
client_obj.foo2()
我想给这个客户端打一次补丁,这样在我的测试中我可以在多个测试中重复使用它,就像这样:
from unittest.mock import patch
from above import client, function_with_client1, function_with_client2
mocked_client = patch('above.client') #this doesn't work
def test_function_with_client1():
function_with_client1()
def test_function_with_client2():
function_with_client2()
上面的补丁不起作用,它用真实的对象实例运行测试。我怎样才能在我的测试文件中正确地修补一次,以便测试在所有测试中重用它?我知道我可以用补丁装饰每个测试,但是我想像在我的真实模块中一样重用相同的补丁对象
修补全局对象总是一个问题,因为它们在修补之前被初始化。这可以通过在修补后重新加载模块来解决,但更好的解决方案是不进行全局初始化。
你可以使用某种惰性初始化,一个简单的实现是这样的:
from somewhere import client
client_obj = None
def get_client():
global client_obj
if not client_obj:
client_obj = client()
return client_obj
def function_with_client1():
get_client().foo1()
...
现在 client()
不会在导入模块时调用,您可以在测试中模拟它。
我有一个模块,我在我的函数之外实例化了一个对象,所以我可以重用它:
from somewhere import client
client_obj = client()
def function_with_client1():
client_obj.foo1()
def function_with_client2()
client_obj.foo2()
我想给这个客户端打一次补丁,这样在我的测试中我可以在多个测试中重复使用它,就像这样:
from unittest.mock import patch
from above import client, function_with_client1, function_with_client2
mocked_client = patch('above.client') #this doesn't work
def test_function_with_client1():
function_with_client1()
def test_function_with_client2():
function_with_client2()
上面的补丁不起作用,它用真实的对象实例运行测试。我怎样才能在我的测试文件中正确地修补一次,以便测试在所有测试中重用它?我知道我可以用补丁装饰每个测试,但是我想像在我的真实模块中一样重用相同的补丁对象
修补全局对象总是一个问题,因为它们在修补之前被初始化。这可以通过在修补后重新加载模块来解决,但更好的解决方案是不进行全局初始化。
你可以使用某种惰性初始化,一个简单的实现是这样的:
from somewhere import client
client_obj = None
def get_client():
global client_obj
if not client_obj:
client_obj = client()
return client_obj
def function_with_client1():
get_client().foo1()
...
现在 client()
不会在导入模块时调用,您可以在测试中模拟它。