TDD模拟-是否指定模拟对象行为白盒测试?

标签 tdd mocking

我最近真的很想去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/

相关文章:

unit-testing - TDD 和 ADO.NET Entity Framework

unit-testing - NSubstitute 是否支持 Partial Mocks 的想法?

python - 模拟数据库 python

unit-testing - 是否可以模拟从 golang 中的包导入的函数?

c# - 是否可以拥有动态的动态部署项?

tdd - 关于 TDD 有哪些常见的误解?

c# - Moq 异步回调因多个参数而失败

c++ - 依赖注入(inject)+完全虚拟与接口(interface)

c# - 模拟 Linq2Sql DataContext

unit-testing - Mockito 不再验证交互,但省略 getter