在C#中模拟非虚方法

时间:2009-07-02 10:43:19

标签: c# .net testing mocking typemock

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

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

提前致谢

2 个答案:

答案 0 :(得分:14)

我来自Typemock,我不会解决“太强大”的评论(虽然我不知道为什么人们不想使用最好的工具)。

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

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

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

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

答案 1 :(得分:7)

根据website,它使用AOP重定向呼叫:

  

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

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

有些人认为模仿一切的能力使得Typemock 过于强大,因为你不必过多考虑好的设计。来自Ayende的引用:

  

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

但当然,因为他是Rhino Mock的创造者,所以他不客观:)

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