C# 为什么.NET(Core)中的大多数模拟框架不能模拟静态和私有方法?
我的问题是关于这个限制的技术原因,而不是关于如何修复它 为什么有些框架喜欢并支持这些特性,但我们不能在or等中使用这些特性C# 为什么.NET(Core)中的大多数模拟框架不能模拟静态和私有方法?,c#,mocking,moq,nsubstitute,fakeiteasy,C#,Mocking,Moq,Nsubstitute,Fakeiteasy,我的问题是关于这个限制的技术原因,而不是关于如何修复它 为什么有些框架喜欢并支持这些特性,但我们不能在or等中使用这些特性 单元测试中提到的项目是否不必要?这是因为这些库的工作方式。当您使用Moq、NSubstitute或FakeItEasy模拟一个类时,它们会动态创建一个从该类继承并重写其方法的类。但他们必须遵循平台的规则来覆盖方法: 根据定义,无法重写非虚拟方法 派生类无法访问私有方法,因此无法重写它们(事实上,C#甚至不允许它们是虚拟的,因为这没有意义) 静态方法也不能被重写,因为它没有
单元测试中提到的项目是否不必要?这是因为这些库的工作方式。当您使用Moq、NSubstitute或FakeItEasy模拟一个类时,它们会动态创建一个从该类继承并重写其方法的类。但他们必须遵循平台的规则来覆盖方法:
- 根据定义,无法重写非虚拟方法
- 派生类无法访问私有方法,因此无法重写它们(事实上,C#甚至不允许它们是虚拟的,因为这没有意义)
- 静态方法也不能被重写,因为它没有意义:多态性基于调用方法的实例的类型,而静态方法没有实例
编辑:请参阅。它使用探查器API劫持方法调用。正如我所说,黑魔法“暂时搁置,主要是基于观点”:它不是基于观点的。这是一个真正的技术原因,也是一个合理的问题。除了Thomas出色的回答之外,这里还有更多的信息(Moq和FIE使用Castle DynamicProxy进行类似的工作)。不幸的是,
Pose
现在可以使用扩展方法。这个图书馆很棒,但不是最新的,功能齐全。