我的问题是关于此限制的技术原因,而不是如何解决。
为什么Telerik JustMock和Typemock Isolator之类的某些框架支持这些功能?并且我们不能在Moq或FakeItEasy或NSubstitute等中使用这些。
提到的项目在单元测试中是否不必要?
答案 0 :(得分:4)
这是因为这些库的工作方式。当您使用Moq,NSubstitute或FakeItEasy模拟类时,它们会动态创建一个从该类继承并覆盖其方法的类。但是他们必须遵循平台的方法进行重载:
事实上,这些模拟库没有做任何事情,您可以通过手动编写假/模拟类来完成自己的工作;它们只是使您摆脱了样板代码而使操作变得更加容易。出于相同的原因,您无法手动覆盖静态或非虚拟方法,而这些库也无法做到这一点。
我不知道JustMock和TypeMock隔离器如何工作;我怀疑他们使用CLR的内部功能做了一些不可思议的事情,或者可能是动态重写代码(Pose就是这样做的:它将对指定方法的调用替换为对替换方法的调用)。
编辑:请参见this question about how TypeMock Isolator works。它使用探查器API劫持方法调用。如我所说,黑暗魔法^^