2015-08-18 23 views
2

(接口VS抽象類)我有下面的代碼不一致的行爲使用fakeiteasy

public interface IFoo 
{ 
    void Execute(); 
} 

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

    public abstract void OnExecute(); 
} 

和下面的測試案例來測試Execute()方法

[Fact] 
public void When_execute_method_called_Expect_executionTime_is_set() 
{ 
    var sutMethod = A.Fake<FooBar>(); 

    A.CallTo(sutMethod). 
       Where(x => x.Method.Name == "OnExecute"). 
       Invokes(x => Thread.Sleep(100))); 

    sutMethod.Execute(); 

    Assert.NotEqual(0, sutMethod.Result.ExecutionTime.Ticks); 
} 

sutMethod.Execute();呼叫會去FooBar.Execute()

後來我決定把界面變成一個抽象類

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

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

    public abstract void OnExecute(); 
} 

現在sutMethod.Execute();調用不調用FooBar.Execute()

我想FakeItEasy將手柄接口和抽象類爲equal.What我缺少什麼?

更新 @布萊爾康拉德規定的行爲

推理是否有可能作出改變最小的測試用例來獲得原始行爲回來?

感謝

回答

3

的差異是由於該方法的ExecuteFooBar的overrideability。 FakeItEasy can only override virtual members, abstract members, or interface members

在你原來的例子中,IFooBar是一個接口,FooBar實現它,Execute是一個具體的方法。它不是虛擬的,也不是抽象的。因此FakeItEasy不能攔截對它的調用,並執行原始方法。

IFooBar更改爲抽象類後,您將有一個摘要IFooBar.Execute,其中您的overrideFooBar中。因此,FooBar.Execute現在是虛擬的,可以被FakeItEasy攔截。它的作用是什麼,所以你的實現不會被調用。

1

在加入幫助解決問題

A.CallTo(() => sutMethod.Execute()).CallsBaseMethod(); 

這調用虛方法ExecuteFooBar