2015-11-14 53 views
2

標題不言自明,但我會詳細說明。 我正在使用FakeItEasy框架,我可以選擇檢查方法被調用的次數。我應該關心撥打嘲笑對象的電話號碼

A.CallTo(() => foo.Bar()).MustHaveHappened();  

但是,這樣做我測試我的代碼的內部行爲。我沒有測試返回值或狀態變化,這是一個好的測試應該做的。 所以我的問題是這樣的:測試一個方法被調用的次數是否是一個好習慣?

回答

1

您應該在很多情況下關心依賴項的調用次數。

例如,假設您的服務通過調用Web服務將某些數據插入某個數據庫。

public interface IDataInserter 
{ 
    void Insert(Data[] data); 
} 

並假設在某些情況下,您需要插入大約10000個項目。但是,Web服務無法在一次調用中處理這種數據量。因此,您決定創建一個裝飾器,將數據拆分爲多個塊並在單個請求中發送每個塊。

public class SplittingDecorator : IDataInserter 
{ 
    private readonly IDataInserter m_DataInserter; 

    public SplittingDecorator(IDataInserter data_inserter) 
    { 
     m_DataInserter = data_inserter; 
    } 

    public void Insert(Data[] data) 
    { 
     var chunks = 
      data 
      .Select((d, i) => new {d, i}) 
      .GroupBy(x => x.i/50) 
      .Select(x => x.Select(y => y.d).ToArray()) 
      .ToList(); 

     foreach (var chunk in chunks) 
     { 
      m_DataInserter.Insert(chunk); 
     } 
    } 
} 

當你要測試的SplittingDecorator類,您將創建data_inserter構造函數的參數進行模擬。

在這樣的試驗,需要斷言嘲笑IDataInserter被調用一些X倍當調用SplittingDecorator.Insert與大小Y.

例如的數據,如果數據大小(data陣列的長度)是160項,你想檢查模擬被調用4次。

+0

是的,但是這個指標實際上給了你什麼?如果我從用戶的角度來看,你不知道插入方法做了什麼。你不知道輸出是否如預期的那樣。你只知道一個方法已經被調用,但是如果它做了正確的事情,你就不會這樣做。 – Tsahi

+0

如果你考慮這個裝飾器的責任,它將把請求分成多個塊。這正是你應該測試的。你應該測試這樣的類會將這些數據分成多個塊。您測試它調用Web服務X次。您還需要檢查是否沒有數據丟失,即所有160項數據都是服務請求的一部分。 –

+0

請注意,如果這個班級沒有正確分配數據,這意味着它沒有完成它的工作。所以你應該測試一下。 –