我正在与我拥有 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
或者是否有替代的“最佳实践”方式让我实现它?
最佳答案
您通常不会模拟被测单元的某些部分。如果您正在测试 MyClass
,您想要测试的一件事是它是否在真正应该这样做的时候创建和执行事务。在您的示例中,覆盖的方法将未经测试。
相反,您应该模拟实际会导致事务发生的层;将 SomeDatabaseApi.connect
、SomeDatabaseApi.Connection.startTransaction
等安排为实际模拟 stub ,以便被测单元仍会调用它们,但随后您可以看到如何他们后来被召唤。
可能有比您可能需要的更多的 python 模拟测试框架,但我很好地利用了 MiniMock ,它简单、有效且富有表现力。
关于Python - 扩展 API 客户端类或传递实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6959154/