在C#中模拟非虚方法

Sam*_*ijo 11 .net c# testing typemock mocking

我正在尝试测试我使用模拟制作的一些类,但我已经看到c#中的所有免费模拟框架都无法模拟非虚方法(如果它不在接口中).

但是,有可以做到这一点的TypeMock,所以它是可能的.任何人都可以展示如何做到这一点?如果我能完成这项任务,我甚至可能会尝试为开源框架做出贡献.

提前致谢

小智 14

我来自Typemock,我不会解决"太强大"的评论(虽然我不能理解为什么人们不想使用最好的工具).

以下是Typemock Isolator的工作原理.你有没有用过性能分析器?隔离器是一个剖析器.它挂钩到CLR并在测试运行时间内改变方法.当一个方法获得JIT时,它会改变它,所以当方法运行时,在执行原始代码之前,它会问:我应该按照原来的意图运行它,如果没有,我该怎么办?而且由于这种特定的技术,它可以模拟任何.Net方法和技术.而已.

当您使用API​​设置行为时,问题的答案现在变得有趣,并且在运行时更改该方法的行为.简单,但在幕后它是很多工作:)

Isolator附带一个VS AddIn,可以在VS中无缝运行测试,并使用命令行工具和MSBuild或NAnt任务在构建服务器中使用.

我很乐意回答您的任何其他问题.

  • 使用真正的锋利刀具时,你必须非常好不要削减自己!).我想这就是他们所说的"太强大"的评论. (2认同)

Ben*_*tBe 7

根据该网站,它使用AOP重定向呼叫:

Typemock Isolator使用面向方面的技术来重定向来自真实代码的调用.这使开发人员能够定义测试方案所需的外部组件的行为.例如,通过指示Typemock Isolator在写入数据库时​​抛出OutOfDiskSpaceException,可以在写入数据库时​​模拟磁盘已满.如果没有Typemock Isolator,这种情况几乎不可能进行测试.开发人员定义实际单元测试中的行为,Typemock Isolator自动隔离所有必需的组件.

此技术要求您在运行测试或使用VS插件之前设置特殊环境.

有些人认为模仿一切的能力使得Typemock 过于强大,因为你不必过多考虑好的设计.艾恩德的一句话:

类型模拟的主要弱点是它的力量,它允许我采取我不想采取的捷径,我想得到一个低耦合和高内聚的系统.

但当然,因为他是犀牛模拟的创造者,他不客观:)

如果你想用这个功能创建一个模拟框架,我认为你有大量的工作,所以我建议购买Typemock,或者学习没有它的代码:)