最近我开始接触TDD,读完了Kent Beck关于测试驱动开发的书后,在我的脑海中仍然有很多关于测试设计的问题。
我目前遇到的一个问题是如何使用Mock对象。以下是一个生成报告的非常简单的代码:
public string MakeFinancialReport()
{
return sys1.GetData() + sys2.GetData() + sys3.GetData();
}
报告必须包含标题、正文和页脚。因此,为了快速测试报告中是否存在这些标题:
public void TestReport()
{
string report = MakeFinancialReport();
Assert.IsTrue(report.Contains("[Title]") && report.Contains("[Body]") && report.Contains("[Footer]"));
}
为了隔离方法,我想要模拟掉sys1、sys2和sys3的调用。但是,如果它们都是模拟的,那么我还剩下什么可以测试的呢?此外,当我模拟它们时,为什么必须告诉模拟对象它们将被期望调用一次并返回X等信息呢?难道不应该只进行黑盒测试,让MakeFinancialReport方法可以尽可能多地调用来构建报告吗?我对这个小问题感到困惑,不确定自己缺少了什么。在我看来,Mocking会带走可测试的代码,对于大多数简单的方法而言,剩下的可测试部分也没有太大帮助。
MakeFinancialReport
的实现才能编写这个测试。如果我们有一天需要添加sys4
,那么我们将不得不修改MakeFinancialReport
和测试两者。这是否意味着使用模拟会损害灵活性? - satorutdd
标签。如果我们有一天编写了一个sys4
,那么我们将需要一个新的测试来测试真实的sys4
,并修改上面的测试以测试MakeFinancialReport
是否执行了新的操作。不同的职责在不同的测试中。 - quamrana