Используя NSubstitute, возможно ли смоделировать / заглушить виртуальный метод базового класса? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть иерархия наследования, которая выглядит примерно так:

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 Я хотел бы заглушить DoSomething () ConcreteImplementation1, чтобы только код в методе DoSomething () ConcreteImplementation2 выполнялся с вызовом base.DoSomething () ничего не делает.

Возможно ли это, и если да, то как мне это сделать? Код выглядел бы иначе, если бы DoSomething () был asyn c?

Спасибо

1 Ответ

1 голос
/ 07 апреля 2020

Я не думаю, что это возможно с NSubstitute или с. NET в целом. NSubstitute поддерживает частичные mocks , но это для каждого члена.

Так что вы можете сделать так, чтобы он вызывал ConcreteImplementation2.DoSomething, но эта реализация вызывает base.DoSomething, так что будет выполняться:

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

NSubstitute работает путем реализации / подклассификации типа , поэтому хорошее правило заключается в том, что если вы не можете сделать что-то вручную с помощью подкласса, NSubstitute не будет быть в состоянии сделать это либо.

В этом случае, если вы создадите class ConcreteImplementation3 : ConcreteImplementation2 и переопределите DoSomething, сможете ли вы позвонить ConcreteImplementation2.DoSomething без его вызова SomeBaseClass.DoSomething? В этом случае я думаю, что ответ - нет, поэтому NSubstitute также не сможет этого сделать.

...