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();