如何在python中使用unittest.mock替换正在测试的类中的对象



我正在为一个类(MyClass(编写unittest,该类具有另一个类的对象实例(MyClient(。我对测试MyClient不感兴趣,所以我想用一个我可以控制的实例来替换它。基本上,MyClient有一个由MyClass调用的"connected"属性。这是一些代码

my_class.py

from my_client import MyClient
class MyClass:
def __init__(self):
self.client = MyClient()

def connect(self):
print("Connecting")
self.client.client_connect()

def send(self):
if self.client.connected:
print("Sending message")
def is_connected(self):
return self.client.connected

my_client.py


class MyClient:
def __init__(self):
self.connected = False
def client_connect(self):
print("Client is connecting")
self.connected = True

我想测试send方法,但我不知道如何注入一个"connected"属性设置为True的客户端对象。类似于Java中的@MockBean。

基本上是这样的:

with mock.patch("in the MyClass", "replace MyClient objects/class", "with MyMockedClass/object") as mocked:
# then test the send method

感谢您的帮助

我找到了一种方法来解决这个问题,用一个新的类替换模块中的类。使用这个答案,我通过执行以下操作,使用MockedClient对my_client.MyClient类进行monkeypatch:

my_test.py

class MockedClient:
def __init__(self):
self.connected = True 
def client_connect(self):
print("Mocked Connecting, but is always True ")
self.connected = True
print("Mocked Connected")
import my_client
my_client.MyClient = MockedClient
from my_class import MyClass

在我这样做之后,所有的MyClient实例都是从我的MockedClient创建的。正如前面的回答中所提到的,需要记住的一件事是确保在进行任何调用之前替换该类。我怀疑这是最好的答案,所以我期待着一种更合适的单元测试/模拟方式。

最新更新