2010-04-06 134 views
2

一個非常簡單的方法,但不知道要測試什麼!單元測試這個 - 簡單的方法,但不知道要測試什麼!

我想在業務邏輯層中測試此方法,_dataAccess顯然來自數據層。

public DataSet GetLinksByAnalysisId(int analysisId) 
{ 
     DataSet result = new DataSet(); 
     result = _dataAccess.SelectAnalysisLinksOverviewByAnalysisId(analysisId); 
     return result; 
} 

的所有IM的測試真的是測試_dataAccess.SelectAnalysisLinksOverviewByAnalysisId()方法被調用!

這裏是我的測試代碼(用犀牛模擬)

[TestMethod] 
public void Test() 
{ 
    var _dataAccess = MockRepository.GenerateMock<IDataAccess>(); 

    _dataAccess.Expect(x => x.SelectAnalysisLinksOverviewByAnalysisId(0)); 

    var analysisBusinessLogic = new AnalysisLinksBusinessLogic(_dataAccess); 
    analysisBusinessLogic.GetLinksByAnalysisId(0); 

    _dataAccess.VerifyAllExpectations(); 

} 

讓我知道,如果你寫了這個方法,你將測試反對什麼考驗?

非常感謝!

+1

您不必要地分配DataSet(),並立即用SALOBAnalysisId()中的返回值替換它。由於新的DataSet()會產生副作用,因此編譯器無法將其優化。 – 2010-04-07 08:28:56

回答

2

您提出的示例測試不測試有問題的方法,而是測試具有相同名稱的重載。

另一個問題是,爲模擬設置的期望不符合所調用的方法。再一次,這是另一種超載。

是進入我腦海的第三件事是,你並不需要在這裏執行基於交互的測試。由於待測方法具有返回值,因此可以執行簡單的基於狀態的測試

這裏是一個可能的選擇:

[TestMethod] 
public void Test() 
{ 
    var id = 1; 
    var expectedResult = new DataSet(); 

    var dataAccess = MockRepository.GenerateStub<IDataAccess>(); 

    dataAccess.Stub(x => x.SelectAnalysisLinksOverviewByAnalysisId(1)) 
     .Return(expectedResult); 

    var analysisBusinessLogic = new AnalysisLinksBusinessLogic(dataAccess); 
    var result = analysisBusinessLogic.GetLinksByAnalysisId(id); 

    Assert.AreEqual(expectedResult, result); 

} 
+0

這麼多的答案,首先讓我糾正我原來的測試(不意味着有任何超載,我的壞......) 只有問題我現在要問的是 - 預期的結果是從模擬。 Assert.AreEqual(expectedResult,result)有什麼意義? 或讓天唯一它測試的是確保_dataAccess.SelectAnalysisLinksOverviewByAnalysisId()被調用? – Luc 2010-04-07 03:32:50

+0

它測試的不止一點,因爲它也測試了SelectAnalysisLinksOverviewByAnalysisId被調用了正確的值。這可能看起來不是很多,但它大約涵蓋了100%的方法。 – 2010-04-07 05:39:25

+0

真棒,乾杯標記! – Luc 2010-04-07 05:44:32

0

其實你覺得這個小調整?

dataAccess.Expect(x => 
x.SelectAnalysisLinksOverviewByAnalysisId(1)).Return(expectedResult); 


Assert.AreEqual(expectedResult, result); 
dataAccess.VerifyAllExpectations(); 

這樣,我們做的斷言,以及預期SelectAnalysisLinksOverviewByAnalysisId()被調用

什麼是你的想法?

+0

是的,我認爲你可以做到這一點。我想你可能想要,因爲沒有它,可以重構'analysisBusinessLogic.GetLinksByAnalysisId(id)'調用來返回一個新的DataSet(等於在測試中創建的那個),而不用調用預期的方法和測試仍然會通過,但功能會被打破。 – 2010-04-07 08:50:41