[英]Python - Extend an API client class or pass instance
我正在与拥有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
类的APIClient
版本吗?
class MyClass(object):
def __init__(self, api_client):
self.api_client = api_client
class MockAPIClient(APIClient):
def an_overwritten_method(self):
pass
还是我有一种替代性的“最佳实践”方法来实现这一目标?
通常,您不会嘲笑被测单元的各个部分。 如果您正在测试MyClass
,那么您要测试的一件事就是它确实可以创建和执行事务。 在您的示例中,重写的方法将未经测试。
相反,您应该模拟实际上会导致交易发生的图层; 安排SomeDatabaseApi.connect
, SomeDatabaseApi.Connection.startTransaction
等实际上是模拟存根,以便被测试的单元仍然调用它们,但是随后您可以看到它们如何被调用。
用于python的模拟测试框架可能比您可能需要的更多,但是我充分利用了MiniMock ,它简单,有效且富有表现力。
+1用于传递api_client
实例; 保持思想松散耦合。
另外,根据APIClient
类,我将创建一个全新的类,而不继承原始APIClient
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.