2
標題不言自明,但我會詳細說明。 我正在使用FakeItEasy框架,我可以選擇檢查方法被調用的次數。我應該關心撥打嘲笑對象的電話號碼
A.CallTo(() => foo.Bar()).MustHaveHappened();
但是,這樣做我測試我的代碼的內部行爲。我沒有測試返回值或狀態變化,這是一個好的測試應該做的。 所以我的問題是這樣的:測試一個方法被調用的次數是否是一個好習慣?
標題不言自明,但我會詳細說明。 我正在使用FakeItEasy框架,我可以選擇檢查方法被調用的次數。我應該關心撥打嘲笑對象的電話號碼
A.CallTo(() => foo.Bar()).MustHaveHappened();
但是,這樣做我測試我的代碼的內部行爲。我沒有測試返回值或狀態變化,這是一個好的測試應該做的。 所以我的問題是這樣的:測試一個方法被調用的次數是否是一個好習慣?
您應該在很多情況下關心依賴項的調用次數。
例如,假設您的服務通過調用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次。
是的,但是這個指標實際上給了你什麼?如果我從用戶的角度來看,你不知道插入方法做了什麼。你不知道輸出是否如預期的那樣。你只知道一個方法已經被調用,但是如果它做了正確的事情,你就不會這樣做。 – Tsahi
如果你考慮這個裝飾器的責任,它將把請求分成多個塊。這正是你應該測試的。你應該測試這樣的類會將這些數據分成多個塊。您測試它調用Web服務X次。您還需要檢查是否沒有數據丟失,即所有160項數據都是服務請求的一部分。 –
請注意,如果這個班級沒有正確分配數據,這意味着它沒有完成它的工作。所以你應該測試一下。 –