我正在为一个类(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创建的。正如前面的回答中所提到的,需要记住的一件事是确保在进行任何调用之前替换该类。我怀疑这是最好的答案,所以我期待着一种更合适的单元测试/模拟方式。