[英]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.