簡體   English   中英

用單元測試復合方法覆蓋C#

[英]Cover with unit test composite method c#

最好的測試方法是什么

public void HandleRequests()
{
    var requests = _requestService.GetAll();
    foreach(var request in requests)
    {
        if (request.IsDelete)
        {
            _dateCheckerService.CheckRequest(request);
            _notificationService.Send(request);
            _invoiceService.CreateInvoice(request);
        }
    }
}

測試是否阻塞的最佳方法是什么? 我想驗證所有3個方法都被稱為不是一個好主意

假設您正確地向服務中注入了模擬數據,(在我看來)有效的測試是檢查日期,通知和發票服務是否已完成刪除請求的工作。

但是,我想指出您正在測試的方法正在做兩件事:

  1. 獲取請求
  2. 處理要求

所以它的名字叫GetAndHandleRequests ,我認為這不是一件好事,您可能想要更改方法簽名以將請求作為參數並處理它們。

要測試此方法(尤其是if塊),並假設您正在注入依賴項(例如_requestService),並且這些依賴項是可以用模擬代替的抽象,那么要測試此方法,您需要斷言您的各種依賴項方法均收到了預期的效果請求對象,例如_dateCheckerService.CheckRequest(request)。

為此,您可以編寫自己的模擬或使用模擬庫(例如MoqNSubstitute)

測試此方法的問題在於,您將不得不進行大量設置(創建四個模擬,構建您的請求集合...),最終結果將變得非常脆弱。 例如,假設您決定重構並且不再需要您的依賴項之一,結果將是相同的,但是您的測試將失敗,因為您不僅在測試方法的功能,而且還測試方法的執行方式,因此測試將取決於在您的實施中。

對代碼進行單元測試是一個很好的計划,但是在這種情況下,我將考慮您將創建的測試的復雜性和脆弱性是否值得單元測試帶來的好處,但是只有您可以回答。

如果您繼續進行測試,我建議對if塊進行多個測試,對每個依賴項進行一個測試,並且每個測試應僅具有一個斷言。

測試If塊;

  1. 創建兩個請求,一個請求為IsDelete = true,另一個請求為IsDelete = false。 設置您的測試,使_requestService.GetAll()將返回返回這兩個請求。
  2. 斷言_dateCheckerService.CheckRequest()已傳遞IsDelete請求,但未傳遞IsDelete = false請求。
  3. 對_notificationService.Send()和_invoiceService.CreateInvoice()重復第二步;

您測試的每個依賴項都應在自己的測試中進行測試。

暫無
暫無

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

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