单元测试这个 - 简单的方法,但不知道要测试什么!

问题描述:

一个非常简单的方法,但不知道要测试什么!单元测试这个 - 简单的方法,但不知道要测试什么!

我想在业务逻辑层中测试此方法,_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

您提出的示例测试不测试有问题的方法,而是测试具有相同名称的重载。

另一个问题是,为模拟设置的期望不符合所调用的方法。再一次,这是另一种超载。

是进入我脑海的第三件事是,你并不需要在这里执行基于交互的测试。由于待测方法具有返回值,因此可以执行简单的基于状态的测试

这里是一个可能的选择:

[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

其实你觉得这个小调整?

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