使用 NSubstitute 是否可以 mock/stub 基础 class 虚拟方法?

Using NSubstitute is it possible to mock/stub a base class virtual method?

我有一个看起来像这样的继承层次结构;

public abstract class SomeBaseClass
{
    public virtual void DoSomething()
    {
        Console.WriteLine("Don't want this to run");
    }
}

public class ConcreteImplementation1 : SomeBaseClass
{
}

public class ConcreteImplementation2 : ConcreteImplementation1
{
    public override void DoSomething()
    {
        Console.WriteLine("This should run");
        base.DoSomething();
    }
}

使用 NSubstitute 我想存根 ConcreteImplementation1 的 DoSomething() 以便只有 ConcreteImplementation2 的 DoSomething() 方法中的代码在调用 base.DoSomething() 时不执行任何操作。

这可能吗?如果可以,我该怎么做?如果 DoSomething() 是异步的,代码看起来会有什么不同吗?

谢谢

我认为这对于 NSubstitute 或一般的 .NET 是不可能的。 NSubstitute does support partial mocks,但这是基于每个成员的。

因此您可以让它调用 ConcreteImplementation2.DoSomething,但该实现调用 base.DoSomething 以便执行:

var sub = Substitute.For<ConcreteImplementation2>();
sub.When(x => x.DoSomething()).CallBase();

NSubstitute works by implementing/sub-classing a type,所以一个好的经验法则是,如果你不能通过子类手动做某事,NSubstitute 也将无法做到。

在这种情况下,如果您创建一个 class ConcreteImplementation3 : ConcreteImplementation2 并覆盖 DoSomething,您可以在不调用 SomeBaseClass.DoSomething 的情况下调用 ConcreteImplementation2.DoSomething 吗?在这种情况下我认为答案是否定的,所以NSubstitute也将无法做到这一点。