tdd - NMock2.0 - 如何 stub 非接口(interface)调用?

标签 tdd mocking typemock nmock

我有一个类 API,它具有完整的代码覆盖率,并使用 DI 来模拟完成所有工作的主类函数 (Job.Run) 中的所有逻辑。

我在生产中发现了一个错误,我们没有对其中一个数据输入字段进行一些验证。

所以,我添加了一个名为 ValidateFoo() 的 stub 函数...针对这个函数编写了一个单元测试来期望 JobFailedException,运行测试 - 它显然失败了,因为该函数是空的。我添加了验证逻辑,现在测试通过了。

太好了,现在我们知道验证有效。问题是 - 我如何编写测试以确保在 Job.Run() 中实际调用了 ValidateFoo()? ValidateFoo() 是 Job 类的私有(private)方法 - 所以它不是一个接口(interface)......

无论如何用 NMock2.0 做这个?我知道 TypeMock 支持非接口(interface)类型的假货。但是现在更改模拟库不是一种选择。在这一点上,如果 NMock 不能支持它,我只需将 ValidateFoo() 调用添加到 Run() 方法并手动测试 - 考虑到我的 Job.Run() 方法显然我不想这样做现在100%覆盖。有什么建议吗?非常感谢,非常感谢。

编辑:我想到的另一个选择是为我的 Job.Run 功能创建一个集成测试(向它注入(inject)复合对象的真正实现而不是模拟)。我将为该字段提供一个错误的输入值,然后验证作业是否失败。这有效并涵盖了我的测试 - 但它不是真正的单元测试,而是测试一个功能单元的集成测试....嗯..

EDIT2:有什么办法可以做到吗?有人有想法吗?也许 TypeMock - 或者更好的设计?

最佳答案

The current version of NMock2可以使用最熟悉的语法模拟具体类型(我不记得他们添加了哪个版本,但我们使用的是 2.1 版):

Job job = mockery.NewMock<Job>(MockStyle.Transparent);
Stub.On(job).Method("ValidateFoo").Will(Return.Value(true));

MockStyle.Transparent 指定您不 stub 或期望的任何内容都应由底层实现处理 - 因此您可以 stub 并为正在测试的实例上的方法设置期望。

但是,您只能对公共(public)方法(和属性)进行 stub 和设置期望,这些方法也必须是虚拟的或抽象的。因此,为了避免依赖集成测试,您有两种选择:
  • 制作 Job.ValidateFoo()公共(public)和虚拟。
  • 将验证逻辑提取到新类中,并将实例注入(inject) Job .
  • 关于tdd - NMock2.0 - 如何 stub 非接口(interface)调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2297730/

    相关文章:

    testing - 您使用什么测试方法来开发网站?

    c# - 在测试之外使用模拟对象,不好的做法?

    c# - 使用 TypeMock 模拟 Autofac 的 "Resolve"扩展方法

    .net - 模拟文件系统

    java - 使用 EasyMock 或 Mockito 模拟 void 方法的 try catch block 并捕获异常

    c# - TypeMock 中的 [TestMethod] 属性在哪里?

    unit-testing - 使用假/ stub 存储库创建单元测试有什么意义

    c# - 如何 TDD 异步事件?

    angularjs - 我应该为这个带有 $http 服务的 Angularjs 登录 Controller 测试什么?

    unit-testing - 如何将远程用户设置为 Jersey 客户端?