Interface 使用FakeiTasy在伪(接口与抽象类)上的不一致行为

Interface 使用FakeiTasy在伪(接口与抽象类)上的不一致行为,interface,abstract-class,fakeiteasy,Interface,Abstract Class,Fakeiteasy,我有以下代码 public interface IFoo { void Execute(); } public abstract class FooBar: IFoo { public void Execute() { OnExecute(); } public abstract void OnExecute(); } 并遵循测试用例来测试Execute方法 现在是sutMethod.Execute;调用不调用FooBar.Ex

我有以下代码

public interface IFoo
{
    void Execute();
}

public abstract class FooBar: IFoo
{
    public void Execute()
    {
         OnExecute();
    }  

    public abstract void OnExecute();
}
并遵循测试用例来测试Execute方法

现在是sutMethod.Execute;调用不调用FooBar.Execute

我以为Fakeitesy会平等地处理接口和抽象类。我缺少什么

更新 @布莱尔·康拉德为这种行为提供了理由

是否可以对测试用例进行最小的更改以恢复原始行为


感谢

这种差异是由于在FooBar上执行的方法的可重写性造成的。 假惺惺的

在您最初的示例中,当IFooBar是一个接口并且FooBar实现它时,Execute是一个具体的方法。它不是虚拟的,也不是抽象的。因此FakeiTesy无法截获对它的调用,并且执行原始方法


一旦将IFooBar更改为抽象类,就有了一个抽象IFooBar.Execute,可以在FooBar中重写它。因此,FooBar.Execute现在是虚拟的,可以被FakeiTasy拦截。这样就不会调用您的实现。

下面的添加有助于解决此问题

A.CallTo(() => sutMethod.Execute()).CallsBaseMethod();
这将调用FooBar的虚拟方法Executeof

public abstract class IFoo
{
    public abstract void Execute();
}

public abstract class FooBar:IFoo
{
    public override void Execute()
    {
         OnExecute();
    }  

    public abstract void OnExecute();
}
A.CallTo(() => sutMethod.Execute()).CallsBaseMethod();