如何用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
相关产品推荐
相关产品推荐

