我最近真的很想去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]"));
}
为了隔离该方法,我想我会 mock sys1,sys2和sys3调用。现在,如果它们都是模拟的,我还有什么要测试?另外,当我对它们进行模拟时,为什么我必须告诉模拟对象它们将被调用一次并返回X等。这不仅是一个黑盒测试,而且MakeFinancialReport可以进行尽可能多的调用它想建立报告吗?
我对这样的小问题感到困惑,我不确定自己缺少什么。我将模拟视为带走了可测试的代码,对于大多数简单的方法,剩下要测试的东西根本没有帮助。
最佳答案
马丁,我认为您应该为sys1-3使用模拟程序,但是它们只需要足够简单即可返回单个字符串。
这意味着您的测试应如下所示:
public void TestReport()
{
// Setup mocks for sys1-3
string report = MakeFinancialReport();
Assert.IsTrue(report.equals("abc"));
}
这表明
MakeFinancialReport
具有它从sys1-3调用GetData()
的属性,并且按此特定顺序连接结果。
关于TDD模拟-是否指定模拟对象行为白盒测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2293160/