簡體   English   中英

如何在不重復測試的情況下測試將大部分行為委派給同一類中另一方法的方法?

[英]How should I test a method that delegates most of its behavior to another method in the same class without duplicating tests?

我正在使用C#和VS 2013中的內置測試工具。

例如,我有一個包含Customer對象列表的Order對象。 我有2種方法可以從Order刪除客戶。 一個以Customer對象作為參數,另一個以CustomerId表示。 第一種方法執行實際刪除。 第二種方法使用Id在訂單中查找Customer實例,然后將該實例傳遞給第一種方法。

第一種方法具有完整的測試范圍。 在測試第二種方法時,我真的只需要驗證它找到了客戶,然后調用第一種方法即可。 由於第一種方法的測試已解決了該問題,因此我不需要驗證Customer真正被刪除。

第一種方法具有完整的測試范圍。 在測試第二種方法時,我真的只需要驗證它找到了客戶,然后調用第一種方法即可。 由於第一種方法的測試已解決了該問題,因此我不需要驗證客戶是否真正被刪除。

我不同意。 這正是您需要測試的內容,因為這就是您要測試的方法的目的。 如何到達那里有一個實現細節。

該方法的目標是:從訂單中刪除客戶。 您的單元測試必須確保將客戶從訂單中刪除。 然后,您必須排列數據,然后調用您的方法,最后驗證結果。 該方法可能會狗糧現在同一類的另一種方法,但是,這並不意味着你不能再更改實施。 但是,如果您確實更改了實現,則已經有測試可以驗證您沒有破壞功能。

看待它的另一種方式,這就是我在編寫測試時嘗試做的事情,就是將被測系統視為黑匣子。 您不知道它是如何工作的,您也不在乎。 您只知道它有工作要做,並且您正在編寫測試以驗證它是否可以完成。 您可能需要了解一些內容(依賴項,參數,結果),但是編寫測試時 ,實現本身並不是您的問題 因此,它重用已測試的功能這一事實也不是您所關心的。

盡管如此,如果您覺得自己在測試中重復太多,那么這是一個查看是否可以重新設計系統的機會(例如,實際上可能存在另一個可以提取的類或依賴項 ),但是現實中,您的系統可能已經足夠簡單,並且您的測試(似乎是重復的)在那里可以確保無論您采用哪種方式,設計都能正確地履行其職責。

由於第一種方法的測試已解決了該問題,因此我不需要驗證客戶是否真正被刪除。

如果將來某個時候更改方法怎么辦? 現在,第二種方法沒有利用第一種方法而被破壞了,但是您的測試仍在通過中?

我仍然會測試這兩種方法的預期結果。 除了我不會在測試單個方法方面考慮之外; 將其視為測試行為。 如果您獲得有效的ID,則該客戶將被刪除。 並且,如果為您提供了有效的Customer ,那么該客戶也將被刪除。 預期的行為不是通過該方法中的id成功檢索到客戶。 預期的行為是,在給定有效參數(無論是id還是客戶對象)后,都會刪除客戶,因此請對此進行測試。

我不知道您的完整要求,但我會編寫如下測試:

  1. GivenValidId_RemovesCustomer
  2. GivenValidCustomer_RemovesCustomer
  3. GivenNullCustomer_ThrowsException
  4. GivenInvalidId_ThrowsException

暫無
暫無

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

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