簡體   English   中英

如何測試父方法?

[英]How do I test parent methods?

假設我有一個看起來像這樣的接口:

interface IMyAPIService
{ 
    List<Order> GetOrders();    
}

和一個實現它的類:

class MyAPIService : IMyAPIService
{
    public List<Order> GetOrders() {}
    public bool Login() {}
}

登錄調用外部服務。 我可以模擬外部服務,從而測試登錄沒有問題。

但是,GetOrders必須先調用Login,然后才能執行所需的操作。

我希望能夠測試如果Login錯誤,GetOrders也會返回錯誤,但是我不能模擬Login,因為它是同一類的成員。 我可以模擬Login調用的外部服務,並確保它返回錯誤,然后我知道Login將返回錯誤,但是我不確定這是否是正確的方法。

我應該僅在IMyAPIService中測試接口方法,而不是在MyAPIService中測試所有公共方法嗎? 那我該如何測試登錄?

為該類的公共接口編寫測試。 如果您的程序中沒有代碼可以調用MyAPIService上的Login方法,則沒有理由將其放在類的公共接口上。

根據您的描述,應該可以通過調用GetOrders方法並模擬外部服務來測試Login方法的所有相關功能。

因此,您可能會進行如下測試:

  • TestGetOrdersThrowsWhenExternalLoginFailsWithException
  • TestGetOrdersThrowsWhenExternalLoginFailsWithError
  • TestGetOrdersThrowsWhenExternalProviderHasNoOrders
  • TestGetOrdersReturnsOrdersFromExternalProviderWhenPresent

您的測試應該只是班上的另一個客戶。 因此,他們只關心類的公共接口。 從這個角度來看,將登錄功能放在MyAPIService的單獨私有方法中還是將所有登錄代碼直接放入GetOrders方法中都沒有關系。 任何調用公共GetOrders方法的測試都應以相同的方式工作。

重點是測試您的類,因為它們將在其余生產代碼中使用。 如果您開始公開所有方法,以便可以單獨測試所有方法,那么您傾向於最終將測試與代碼緊密耦合(使任何級別的重構都比需要的痛苦得多),或者重復測試(除非外部登錄成功,否則GetOrders不能返回任何Orders ,因此,測試您的Login方法調用外部登錄是多余的),否則您將進入模擬正在測試的類的黑暗世界(可以使用某些方法來完成)模擬框架)。 在類上擁有比所需數量更多的公共方法,也會使其他人在使用您的類時感到困惑(嗯……看來我需要調用Login ,然后才能調用GetOrders )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM