Python - 扩展API客户端类或传递实例

时间:2011-08-05 15:57:19

标签: python testing

我正在与我有一个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

或者,对我来说,实施此方法是否存在一种“最佳实践”方式?

2 个答案:

答案 0 :(得分:0)

您通常不会模拟被测单位的部分内容。如果您正在测试MyClass,那么您要测试的一件事就是它创建并执行事务时它确实应该这样做。在您的示例中,重写的方法将不进行测试。

相反,您应该模拟实际会导致事务发生的图层;安排SomeDatabaseApi.connectSomeDatabaseApi.Connection.startTransaction等实际上是模拟存根,以便测试中的单位仍然调用它们,但随后你可以看到它们之后是如何被调用的。

python的模拟测试框架可能比你可能需要的更多,但我已经很好地利用了MiniMock,它简单,有效,富有表现力。

答案 1 :(得分:0)

传递api_client个实例的

+1;保持思想松散耦合。

另外,根据APIClient类,我会创建一个全新的类,而不继承原始的APIClient