[英]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
對象作為參數,另一個以Customer
的Id
表示。 第一種方法執行實際刪除。 第二種方法使用Id
在訂單中查找Customer
實例,然后將該實例傳遞給第一種方法。
第一種方法具有完整的測試范圍。 在測試第二種方法時,我真的只需要驗證它找到了客戶,然后調用第一種方法即可。 由於第一種方法的測試已解決了該問題,因此我不需要驗證Customer
真正被刪除。
第一種方法具有完整的測試范圍。 在測試第二種方法時,我真的只需要驗證它找到了客戶,然后調用第一種方法即可。 由於第一種方法的測試已解決了該問題,因此我不需要驗證客戶是否真正被刪除。
我不同意。 這正是您需要測試的內容,因為這就是您要測試的方法的目的。 如何到達那里有一個實現細節。
該方法的目標是:從訂單中刪除客戶。 您的單元測試必須確保將客戶從訂單中刪除。 然后,您必須排列數據,然后調用您的方法,最后驗證結果。 該方法可能會狗糧現在同一類的另一種方法,但是,這並不意味着你不能再更改實施。 但是,如果您確實更改了實現,則已經有測試可以驗證您沒有破壞功能。
看待它的另一種方式,這就是我在編寫測試時嘗試做的事情,就是將被測系統視為黑匣子。 您不知道它是如何工作的,您也不在乎。 您只知道它有工作要做,並且您正在編寫測試以驗證它是否可以完成。 您可能需要了解一些內容(依賴項,參數,結果),但是編寫測試時 ,實現本身並不是您的問題。 因此,它重用已測試的功能這一事實也不是您所關心的。
盡管如此,如果您覺得自己在測試中重復太多,那么這是一個查看是否可以重新設計系統的機會(例如,實際上可能存在另一個可以提取的類或依賴項 ),但是現實中,您的系統可能已經足夠簡單,並且您的測試(似乎是重復的)在那里可以確保無論您采用哪種方式,設計都能正確地履行其職責。
由於第一種方法的測試已解決了該問題,因此我不需要驗證客戶是否真正被刪除。
如果將來某個時候更改方法怎么辦? 現在,第二種方法沒有利用第一種方法而被破壞了,但是您的測試仍在通過中?
我仍然會測試這兩種方法的預期結果。 除了我不會在測試單個方法方面考慮之外; 將其視為測試行為。 如果您獲得有效的ID,則該客戶將被刪除。 並且,如果為您提供了有效的Customer
,那么該客戶也將被刪除。 預期的行為不是通過該方法中的id成功檢索到客戶。 預期的行為是,在給定有效參數(無論是id還是客戶對象)后,都會刪除客戶,因此請對此進行測試。
我不知道您的完整要求,但我會編寫如下測試:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.