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

如何用NSubstitute监视构造函数中调用的虚拟方法?

解决方案:验证构造函数中调用的虚方法

为什么你的现有方式失败

  • Substitute.For<A>():NSubstitute创建的是完全替代类,不会执行原始类的构造函数,aa()根本没被调用,自然验证失败。
  • Substitute.ForPartsOf<A>():虽然会执行原始构造函数,但构造函数内部的虚方法调用不会被NSubstitute的代理捕获——因为构造函数执行阶段,代理的调用记录机制还未完全初始化,所以Received()检测不到这次调用。

可行方案

方案1:创建测试子类记录调用

直接写一个继承自A的测试类,重写aa()来统计调用次数,无需依赖NSubstitute的验证机制:

int aaCallCount = 0;

class TestableA : A
{
    public override void aa()
    {
        aaCallCount++;
        base.aa(); // 如果需要保留原始方法逻辑,可保留此行;否则可以删除
    }
}

// 实例化子类,触发构造函数调用aa()
new TestableA();

// 验证调用次数
Assert.AreEqual(1, aaCallCount);

方案2:重构类A(推荐)

构造函数中调用虚方法本身是不良设计——子类重写该方法时,基类构造函数调用子类方法时,子类的成员可能还未初始化,容易引发潜在问题。建议重构代码,将初始化逻辑移到单独方法:

class A
{
    public A()
    {
        // 移除构造函数中的aa()调用
    }

    // 新增初始化方法
    public void Initialize()
    {
        aa();
    }

    public virtual void aa()
    {
       // does something
    }
}

// 测试代码
var substitute = Substitute.ForPartsOf<A>();
substitute.Initialize();
substitute.Received().aa();

内容的提问来源于stack exchange,提问作者hrushi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:02:03