如何修补在函数外部实例化的对象以在每个测试中重用 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() 不会在导入模块时调用,您可以在测试中模拟它。