Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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# 为什么.NET(Core)中的大多数模拟框架不能模拟静态和私有方法?_C#_Mocking_Moq_Nsubstitute_Fakeiteasy - Fatal编程技术网

C# 为什么.NET(Core)中的大多数模拟框架不能模拟静态和私有方法?

C# 为什么.NET(Core)中的大多数模拟框架不能模拟静态和私有方法?,c#,mocking,moq,nsubstitute,fakeiteasy,C#,Mocking,Moq,Nsubstitute,Fakeiteasy,我的问题是关于这个限制的技术原因,而不是关于如何修复它 为什么有些框架喜欢并支持这些特性,但我们不能在or等中使用这些特性 单元测试中提到的项目是否不必要?这是因为这些库的工作方式。当您使用Moq、NSubstitute或FakeItEasy模拟一个类时,它们会动态创建一个从该类继承并重写其方法的类。但他们必须遵循平台的规则来覆盖方法: 根据定义,无法重写非虚拟方法 派生类无法访问私有方法,因此无法重写它们(事实上,C#甚至不允许它们是虚拟的,因为这没有意义) 静态方法也不能被重写,因为它没有

我的问题是关于这个限制的技术原因,而不是关于如何修复它

为什么有些框架喜欢并支持这些特性,但我们不能在or等中使用这些特性


单元测试中提到的项目是否不必要?

这是因为这些库的工作方式。当您使用Moq、NSubstitute或FakeItEasy模拟一个类时,它们会动态创建一个从该类继承并重写其方法的类。但他们必须遵循平台的规则来覆盖方法:

  • 根据定义,无法重写非虚拟方法
  • 派生类无法访问私有方法,因此无法重写它们(事实上,C#甚至不允许它们是虚拟的,因为这没有意义)
  • 静态方法也不能被重写,因为它没有意义:多态性基于调用方法的实例的类型,而静态方法没有实例
事实上,这些模拟库并没有做任何您自己无法通过手动编写假/模拟类来完成的事情;他们只是通过解除你的样板代码来让事情变得更容易。您无法手动重写静态或非虚拟方法,出于同样的原因,这些库也无法这样做

我不知道JustMock和TypeMock隔离器是如何工作的;我怀疑他们对CLR的内部结构做了一些暗算,或者动态地重写代码(就是这样做的:它用对替换方法的调用替换对指定方法的调用)


编辑:请参阅。它使用探查器API劫持方法调用。正如我所说,黑魔法“暂时搁置,主要是基于观点”:它不是基于观点的。这是一个真正的技术原因,也是一个合理的问题。除了Thomas出色的回答之外,这里还有更多的信息(Moq和FIE使用Castle DynamicProxy进行类似的工作)。不幸的是,
Pose
现在可以使用扩展方法。这个图书馆很棒,但不是最新的,功能齐全。