在C#中模拟非虚方法

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

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

提前致谢

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

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

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

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

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

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

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

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

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

Type Mock的主要弱点在于它的强大function,它允许我采取我不想采取的捷径,我希望得到一个低耦合和高内聚的系统。

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

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