You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否让基类实现不执行任何操作?遗留系统无DI/接口测试咨询

针对Brownfield应用测试的FakeItEasy与Microsoft Fakes方案分析

针对你维护的这个无测试、无DI/接口的复杂brownfield应用,我来梳理下FakeItEasy和Microsoft Fakes在满足“让基类实现不执行任何操作”需求上的可行性,完全贴合你不能用DI或接口的限制:

FakeItEasy的适配情况

  • 可行场景:如果你的基类方法是虚方法,FakeItEasy可以直接伪造基类实例,默认情况下所有虚方法都会被拦截,不执行原逻辑(返回对应类型的默认值,比如void方法就啥也不做)。你不需要对原代码做任何重构,只需要在测试里创建伪造的基类对象就行,比如:
    var fakeBase = A.Fake<YourBaseClass>();
    // 此时调用fakeBase的虚方法,原基类逻辑不会执行
    
  • 局限性:如果基类里的方法是非虚方法、静态方法或者密封方法,FakeItEasy就无能为力了——它的伪造机制依赖继承和虚方法拦截,没法绕过非虚方法的直接调用。这种情况下FakeItEasy帮不到你。

Microsoft Fakes的适配情况

这绝对是更适配你场景的方案,尤其是在你能拿到许可的前提下:

  • 核心优势:Microsoft Fakes通过Shim机制可以拦截几乎所有类型的方法调用——不管是虚方法、非虚方法、静态方法,甚至密封类的方法都能搞定,完全不需要原代码有任何接口或虚方法设计,完美适配你的无DI、无接口的brownfield现状。
  • 实现“基类方法不执行”的方式:针对你的基类,你只需要在测试项目中启用Fakes,生成对应的Shim类,然后指定方法的替代行为为空操作即可。举个简单的代码示例:
    using (ShimsContext.Create())
    {
        // 让基类的DoWork方法啥也不做
        ShimYourBaseClass.DoWork = () => {};
        // 后续测试中调用该方法时,原基类逻辑不会执行
    }
    
  • 注意事项:Microsoft Fakes需要Visual Studio Enterprise版本支持,所以你得确认团队能拿到对应的许可。

总结建议

  • 如果你的基类方法大多是虚方法,FakeItEasy可以快速满足需求,零重构就能实现基类逻辑不执行;但遇到非虚方法就会卡壳。
  • 如果你能拿到Microsoft Fakes的许可,它是完全适配你场景的最优解——不管基类方法是什么类型,都能轻松拦截并让原逻辑不执行,完全不需要修改现有代码结构。

内容的提问来源于stack exchange,提问作者P.Brian.Mackey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:20:13