Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中模拟非虚方法#_C#_.net_Testing_Mocking_Typemock - Fatal编程技术网

C# 在C语言中模拟非虚方法#

C# 在C语言中模拟非虚方法#,c#,.net,testing,mocking,typemock,C#,.net,Testing,Mocking,Typemock,我试图测试我使用mock创建的一些类,但我看到c#中的所有免费mock框架都无法模拟非虚拟方法(如果它不在接口中) 但是,TypeMock可以做到这一点,所以这是可能的。有人能示范怎么做吗?如果我能做到这一点,我甚至可以尝试为开源框架做出贡献 提前感谢根据协议,it使用AOP重定向呼叫: Typemock隔离器使用面向方面的技术重定向来自真实代码的调用。这使开发人员能够定义测试场景所需的外部组件的行为。例如,您可以通过指示Typemock Isolator在写入数据库时抛出OutOfDiskSp

我试图测试我使用mock创建的一些类,但我看到c#中的所有免费mock框架都无法模拟非虚拟方法(如果它不在接口中)

但是,TypeMock可以做到这一点,所以这是可能的。有人能示范怎么做吗?如果我能做到这一点,我甚至可以尝试为开源框架做出贡献

提前感谢

根据协议,it使用AOP重定向呼叫:

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

这种技术要求您在运行测试或使用VS插件之前设置一个特殊的环境

有些人认为模仿一切事物的能力使得Typemock太强大了,因为你不必考虑太多好的设计。引自:

类型Mock的主要缺点是它的强大,它允许我走我不想走的捷径,我想得到一个低耦合、高内聚的系统

但当然,由于他是犀牛模仿的创造者,他并不客观:)


如果您想创建一个具有此功能的模拟框架,我认为您需要做大量的工作,因此我建议您要么购买Typemock,要么学习在没有它的情况下编写代码:)

我来自Typemock,我不会提及“太强大”的评论(尽管我无法理解为什么人们不想使用最好的工具来完成这项工作)

下面是Typemock隔离器的工作原理。您是否使用过性能探查器?隔离器是一个探查器。它挂接到CLR中,并在测试运行时更改方法。当一个方法受到JIT时,它会更改它,因此当该方法运行时,在执行原始代码之前,它会问:我是否应该按照最初的预期运行它,如果不是,会发生什么我应该这样做吗?由于这种特殊的技术,它可以模仿任何.Net方法和技术。就是这样

当您使用API设置行为时,问题的答案现在变得有趣,并在该方法的运行时更改行为。虽然简单,但实际上需要大量工作:)

Isolator附带了一个VS加载项,可以在VS中无缝地运行测试,还附带了一个命令行工具和MSBuild或NAnt任务,以便在生成服务器中使用


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

最佳猜测,AppDomains、Reflection.Emit和一些黑客和魔法的组合。但我几乎没有资格对此做出许多有根据的猜测。请看,在运行TypeMock之前,您确实需要设置一个特殊的环境(这也有一个VS插件),我同意TypeMock拥有“足够多的绳子来吊死您自己”,我猜typemock的主要场景是,如果你需要使用传统系统或第三方,而你不能(轻松地)更改设计,你仍然想添加单元测试并模拟某些东西。你必须非常好,在使用真正锋利的刀具时不要割伤自己!;)。我想这就是他们所说的“太强大”的意思。