2013-02-15 179 views
0

我有一個方法從另一個類中調用另一個方法。C#單元測試嵌套函數

我應該如何爲這些方法編寫單元測試?我是否應該爲這兩種方法編寫不同的測試用例,還是僅爲LoadService.InitiateManualRun函數編寫測試用例?

一個例子會非常有幫助。

class LoadService 
{  
    public StagingLoadStatistics InitiateManualRun(string currentUser, string startDate, string endDate) 
    { 
     var response = _repository.InitiateManualRun(currentUser, startDate, endDate); 

     return response; 
    } 
} 

class LoadRepository 
{  
    public StagingLoadStatistics InitiateManualRun(string currentUser, string startDate, string endDate) 
    { 
     _webServiceObject.InitiateManualRun(currentUser, startDate, endDate); 
    } 
} 

回答

3

您的代碼示例不會從您的其他抽象層次中發現很多附加值,但我會授予您爲簡潔起見可能會遺漏一些細節。

如果我正在測試調用另一個類的函數的函數,我主要關心的是外部函數提供了對內部函數的期望輸入,或者外部函數使用內部函數的輸出執行了正確的操作, 或兩者。 測試內部函數不是外部函數測試的關注點,我將自行測試該類和函數。

我會隔離我用嘲笑/存根外的功能,以確保我測試我覺得我測試了,什麼任何失敗都將成爲功能做錯事的結果,不是一些嵌套的依賴。我對嵌套依賴的測試會向我揭示該領域的錯誤。

鑑於你的原代碼,我會暴露我的依賴

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); 

你的假可以採取任何數量的口味,又可以推出自己的或使用圖書館吧。當我推出我自己的產品時,我通常只在存儲期望值和結果的假貨中使用支持字典,然後在滿足預期時返回結果。這允許存儲多個期望/結果對(如果適用的話)。但是如果你選擇這個方向進行高度獨立的測試,你會想研究所有關於假實現的選項。

+1

非常感謝您的詳細解釋 – 2013-02-16 23:30:46

1

您應該編寫LoadService.InitiateManualRun方法的單元測試。

這將有助於驗證更高級別的行爲,並提供更靈活的測試,以便在更改嵌套方法的簽名或其他實現細節時不會中斷。你的單元測試應該驗證程序的用例或行爲。

這就是說,在你共享的代碼中只有一個執行分支,所以我不確定你的單元測試會驗證什麼。

+1

@csharp_beginer,請注意,如果你採用這種方法,你正在寫什麼將被稱爲*集成測試,*,他們*是有價值的。但是集成測試往往不能很好地按照定義進行隔離,並且根據他們正在做的事情,他們執行起來可能會很慢,特別是如果他們涉及到訪問數據庫或發起Web服務調用。 – 2013-02-15 22:58:00