2013-04-04 35 views
5

我有以下方式一類的設置:微軟是否支持墊片上的抽象方法?

public abstract FooClass { 
    public FooClass() { 
     // init stuff; 
    } 

    public void RandomMethod() { 
     // do stuff; 
    } 

    public abstract WhatIWantToShim(); 
} 

我想要做的是設置WhatIWantToShim上ShimFooClass像這樣:

ShimFooClass.AllInstances.WhatIWantToShim =() => Boo(); 

我可以設置RandomMethod就好了,

ShimFooClass.AllInstances.RandomMethod =() => CalculatePi(); 

但是,似乎生成的ShimFooClass不會在ShimFooClass的AllInstances屬性上創建WhatIWantToShim屬性。

我已經看過http://msdn.microsoft.com/en-us/library/hh549176.aspx#bkmk_shim_basics但我沒有看到關於抽象方法的任何內容。我看到的唯一不支持的東西是終結器。有人知道這裏發生了什麼,如果這種情況得到支持?

+0

你可以創建一個方法來設置屬性? – RedJandal 2013-04-04 22:54:09

+0

沒有關注你,在shim類中創建的抽象方法沒有屬性。那就是問題所在。 – 2013-04-05 19:17:13

回答

4

唉唉....無賴

接口和抽象方法。存根提供了可用於測試的接口和抽象方法的實現。 Shims不能測量接口和抽象方法,因爲它們沒有方法體。

http://msdn.microsoft.com/en-us/library/hh549175(v=vs.110).aspx

更新:什麼雖然可以做的是磕碰的墊片。

using (ShimsContext.Create()) 
{ 
    bool wasAbstractMethodCalled = false; 
    var targetStub = new StubFooClass() 
    { 
     WhatIWantToShim01 =() => wasAbstractMethodCalled = true 
    }; 
    var targetShim = new ShimFooClass(targetStub); 
    targetShim.AllInstances.RandomMethod =() => CalculatePi(); 
    FooClass target = targetShim.Instance; 
    target.WhatIWantToShim(); 
    Assert.IsTrue(wasAbstractMethodCalled, "The WhatIWantToShim method was not called."); 
} 

由於墊片不能處理的迂迴方法WhatIWantToShim和存根可以,只需要創建存根類的新實例,並設置迂迴處理程序抽象方法。 (注意:在我的實際代碼中生成Fakes時,會自動爲我添加WhatIWantToShim結尾的01標記)。

然後只是將實例化的存根傳遞給填充類的構造函數並根據需要填充。

0

我在這裏回答,因爲我很確定其他答案沒有回答這個問題,所以以後的搜索將返回有用的信息。

首先,您無法填充接口。抽象方法相當於一個接口。此外,沒有理由。

{ 
    bool wasAbstractMethodCalled = false; 
    var targetStub = new StubFooClass() 
    { 
     WhatIWantToShim01 =() => wasAbstractMethodCalled = true 
    }; 
    ShimFooClass.AllInstances.RandomMethod = @class => targetStub.CalculatePi(); 
    targetStub.WhatIWantToShim(); 
    Assert.IsTrue(wasAbstractMethodCalled, "The WhatIWantToShim method was not called."); 
} 

以上是以前答案的簡化版本,只會簡單地調用您剛分配的操作。這可能不是你的意圖。

請記住你爲什麼選擇墊片。當你希望避免在你正在測試的方法中的方法調用的影響時,你可以發揮作用。抽象方法可以沒有主體,因此不會影響任何東西。唯一有用的是在一個孩子班上,在那裏墊片將首先提供給你。

您可能遇到問題的唯一情況是,第三個類是祕密持有抽象類的實例並使用子類實例化它。你無法僞造。然而,這是可怕的設計;實例應該來自某種方法(可以填充)或傳入(因爲DI是一件好事!),否則抽象是毫無價值的,你也可以將實例聲明爲子類型,因爲你沒有以任何方式使用抽象。

相關問題