2012-10-01 79 views
8

我正在使用Microsoft Fakes進行一些單元測試。我的界面看起來是這樣的:如何使用Microsoft Fakes引用具有自身泛型參數的存根?

interface ISecuredItem<TChildType> where TChildType : class, ISecuredItem<TChildType> 
{ 
    SecurityDescriptor Descriptor { get; } 
    IEnumerable<TChildType> Children { get; } 
} 

這方面的典型實現是這樣的:

class RegistryKey : ISecuredItem<RegistryKey> 
{ 
    public SecurityDescriptor Descriptor { get; private set; } 
    public IEnumerable<RegistryKey> Children { get; } 
} 

我想使用微軟正版正貨這個接口,並將它生成存根我。問題是,形式假貨使用是StubInterfaceNameHere<>,所以在上面的例子中,你最終試圖做類似StubISecuredItem<StubISecuredItem<StubISecuredItem<StubISecuredItem....

這可能嗎?如果是這樣,我如何以這種方式使用Fakes?

回答

5

經過一番實驗後,我發現了一個工作解決方案,雖然它不是最優雅的。

這是你的常規代碼:

public interface ISecuredItem<TChildType> 
    where TChildType : ISecuredItem<TChildType> 
{ 
    SecurityDescriptor Descriptor { get; } 
    IEnumerable<TChildType> Children { get; } 
} 

在您的測試項目,你在你的單元測試創​​建StubImplemtation接口

public interface StubImplemtation : ISecuredItem<StubImplemtation> { } 

然後你就可以做到以下幾點:

var securedItemStub = new StubISecuredItem<StubImplemtation> 
          { 
           ChildrenGet =() => new List<StubImplemtation>(), 
           DescriptorGet =() => new SecurityDescriptor() 
          }; 

var children = securedItemStub.ChildrenGet(); 
var descriptor = securedItemStub.DescriptorGet(); 

如果這是n,則可以跳過整個StubImplementation並使用RegistryKey問題。

+0

這絕對會做到這一點,但它需要在測試項目中將接口作爲存根/模擬來實現。我不知道這是否是這個想法... –

+0

我可以想象它不是這個想法..但我看不到任何其他解決方案。當您查看Fakes框架生成的源代碼時,泛型參數的類型是ISecuredItem,而不是StubISecuredItem。我幾乎會說這是該框架中的一個錯誤。測試項目中的實現可以讓所有方法拋出一個NotImplementedException,所以它不應該花費太多時間來創建。 –

+0

我知道,我完全同意。自動出現在我腦海中的答案是您提到的那個。 –

相關問題