使用 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也将无法做到这一点。
我有一个看起来像这样的继承层次结构;
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也将无法做到这一点。