您的代碼示例不會從您的其他抽象層次中發現很多附加值,但我會授予您爲簡潔起見可能會遺漏一些細節。
如果我正在測試調用另一個類的函數的函數,我主要關心的是外部函數提供了對內部函數的期望輸入,或者外部函數使用內部函數的輸出執行了正確的操作, 或兩者。 測試內部函數不是外部函數測試的關注點,我將自行測試該類和函數。
我會隔離我用嘲笑/存根外的功能,以確保我測試我覺得我測試了,什麼任何失敗都將成爲是功能做錯事的結果,不是一些嵌套的依賴。我對嵌套依賴的測試會向我揭示該領域的錯誤。
鑑於你的原代碼,我會暴露我的依賴
class LoadService
{
ILoadRepository _repository;
public LoadService(ILoadRepository repository)
{
_repository = repository;
}
public StagingLoadStatistics InitiateManualRun(string currentUser, string startDate, string endDate)
{
var response = _repository.InitiateManualRun(currentUser, startDate, endDate);
return response;
}
}
而基於關閉此代碼,我關心的是簡單的(實際代碼可能會有所不同,當然)。看來我只需要驗證我的參數是否正確地傳遞給我的依賴關係,然後返回依賴關係的結果。這是一個很容易編寫的測試,但是您需要編寫一個虛擬的依賴關係實現或者使用一個模擬庫。但是,我的測試可能是這樣的:
var fakeRepository = new FakeRepository();
var expectedArguments = Tuple.Create(someUser, someStartDate, someEndDate);
var expectedOutput = new StagingLoadStatistics();
fakeRepository.SetOutputForExpectedArguments(expectedArguments, expectedOutput);
var service = new LoadService(fakeRepository);
var result = service.InitiateManualRun(someUser, someStartDate, someEndDate);
Assert.AreSame(expectedOutput, result);
你的假可以採取任何數量的口味,又可以推出自己的或使用圖書館吧。當我推出我自己的產品時,我通常只在存儲期望值和結果的假貨中使用支持字典,然後在滿足預期時返回結果。這允許存儲多個期望/結果對(如果適用的話)。但是如果你選擇這個方向進行高度獨立的測試,你會想研究所有關於假實現的選項。
非常感謝您的詳細解釋 – 2013-02-16 23:30:46