我正在与我有一个Python库的API进行交互。该库提供了一个APIClient
类,它提供了API的所有功能。我希望根据某些逻辑与此API进行交互,并且我希望能够测试逻辑 wihtout 进行API调用(即模拟),因为它是事务性的。
显然,我需要模拟(在某个阶段)某些API客户端的功能,但我不确定如何最好地解决这个问题。
我应该只是扩展APIClient
类,实现我的逻辑,然后再次扩展我的类来创建一个模拟版本:
class MyClass(APIClient):
pass #Lots of interesting things actually happen here
class MyTestClass(MyClass):
def an_overridden_method(self):
pass #here I implement a method for testing
或者我应该将APIClient
实例传递给我的班级,当我想测试时,我是否应该传入APIClient
类的模拟版本?
class MyClass(object):
def __init__(self, api_client):
self.api_client = api_client
class MockAPIClient(APIClient):
def an_overwritten_method(self):
pass
或者,对我来说,实施此方法是否存在一种“最佳实践”方式?
答案 0 :(得分:0)
您通常不会模拟被测单位的部分内容。如果您正在测试MyClass
,那么您要测试的一件事就是它创建并执行事务时它确实应该这样做。在您的示例中,重写的方法将不进行测试。
相反,您应该模拟实际会导致事务发生的图层;安排SomeDatabaseApi.connect
,SomeDatabaseApi.Connection.startTransaction
等实际上是模拟存根,以便测试中的单位仍然调用它们,但随后你可以看到它们之后是如何被调用的。
python的模拟测试框架可能比你可能需要的更多,但我已经很好地利用了MiniMock,它简单,有效,富有表现力。
答案 1 :(得分:0)
api_client
个实例的+1;保持思想松散耦合。
另外,根据APIClient
类,我会创建一个全新的类,而不继承原始的APIClient
。