2009-07-02 90 views
11

我试图测试一些类,我使用嘲笑,但我已经看到在C#中的所有免费嘲笑框架不能嘲笑非虚拟方法(如果它是不在界面中)。在C#中嘲弄非虚拟方法#

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

在此先感谢

+0

最好的猜测,AppDomains,Reflection.Emit和hackery和魔术的组合。但我很难有资格对此进行许多有教育的猜测。 – 2009-07-02 10:50:55

+0

添加了typemock标记 – BengtBe 2009-07-02 11:21:22

+0

另请参阅http://stackoverflow.com/questions/2187513/how-to-make-a-unit-test-mock-of-an-object-with-non-virtual-functions/6690183 – 2011-07-14 08:06:10

回答

7

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

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

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

有些人认为模拟一切的能力使Typemock 功能太强大,因为你不必多想好设计。从Ayende引述:

类型模拟的主要弱点是它的力量,它让我采取我不想走捷径,我希望得到一个系统,低耦合,高凝聚力。

不过,当然,因为他是犀牛模拟的创世他是不客观的:)

我会认为你是在为工作很大,如果你想创建具有此功能的模拟框架,所以我会建议要么购买Typemock,要么学会编码没有它:)

14

我来自Typemock,我不会解决“太强大”的评论(尽管它超出了我为什么人们不想要为这项工作使用最好的工具)。

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

当您使用API​​设置行为时,问题的答案现在变成了intersting,并更改了该方法在运行时的行为。简单,但涵盖了它很多工作:)

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

我很乐意回答您可能遇到的任何其他问题。