单元测试这个 - 简单的方法,但不知道要测试什么!
一个非常简单的方法,但不知道要测试什么!单元测试这个 - 简单的方法,但不知道要测试什么!
我想在业务逻辑层中测试此方法,_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();
}
让我知道,如果你写了这个方法,你将测试反对什么考验?
非常感谢!
您提出的示例测试不测试有问题的方法,而是测试具有相同名称的重载。
另一个问题是,为模拟设置的期望不符合所调用的方法。再一次,这是另一种超载。
是进入我脑海的第三件事是,你并不需要在这里执行基于交互的测试。由于待测方法具有返回值,因此可以执行简单的基于状态的测试。
这里是一个可能的选择:
[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);
}
这么多的答案,首先让我纠正我原来的测试(不意味着有任何超载,我的坏......) 只有问题我现在要问的是 - 预期的结果是从模拟。 Assert.AreEqual(expectedResult,result)有什么意义? 或让天唯一它测试的是确保_dataAccess.SelectAnalysisLinksOverviewByAnalysisId()被调用? – Luc 2010-04-07 03:32:50
它测试的不止一点,因为它也测试了SelectAnalysisLinksOverviewByAnalysisId被调用了正确的值。这可能看起来不是很多,但它大约涵盖了100%的方法。 – 2010-04-07 05:39:25
真棒,干杯标记! – Luc 2010-04-07 05:44:32
其实你觉得这个小调整?
dataAccess.Expect(x =>
x.SelectAnalysisLinksOverviewByAnalysisId(1)).Return(expectedResult);
Assert.AreEqual(expectedResult, result);
dataAccess.VerifyAllExpectations();
这样,我们做的断言,以及预期SelectAnalysisLinksOverviewByAnalysisId()被调用
什么是你的想法?
是的,我认为你可以做到这一点。我想你可能想要,因为没有它,可以重构'analysisBusinessLogic.GetLinksByAnalysisId(id)'调用来返回一个新的DataSet(等于在测试中创建的那个),而不用调用预期的方法和测试仍然会通过,但功能会被打破。 – 2010-04-07 08:50:41
您不必要地分配DataSet(),并立即用SALOBAnalysisId()中的返回值替换它。由于新的DataSet()会产生副作用,因此编译器无法将其优化。 – 2010-04-07 08:28:56