2012-10-01 3 views
8

Ich verwende Microsoft Fakes in einigen Komponententests, an denen ich arbeite. Meine Schnittstelle sieht wie folgt aus:Wie bezieht man sich auf einen Stub, der einen generischen Parameter von sich selbst mit Microsoft Fakes hat?

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

Eine typische Implementierung dieses wie folgt aussieht:

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

ich diese Schnittstelle mit Microsoft Fakes verwenden möchten, und haben sie einen Stub für mich generieren. Das Problem ist, dass die Form, die Fakes verwendet, StubInterfaceNameHere<> ist, also im obigen Beispiel enden Sie versuchen, so etwas zu tun StubISecuredItem<StubISecuredItem<StubISecuredItem<StubISecuredItem....

Ist das möglich? Wenn ja, wie verwende ich Fakes auf diese Weise?

Antwort

5

Nach ein paar Experimenten fand ich eine funktionierende Lösung, obwohl es nicht die eleganteste ist.

Dies ist Ihr regulärer Code:

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

In Ihrem Testprojekt Sie eine StubImplemtation Schnittstelle

public interface StubImplemtation : ISecuredItem<StubImplemtation> { } 

Dann in Ihrem Unit-Test erstellen, können Sie folgendes tun:

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

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

Sie können das ganze StubImplementation überspringen und RegistryKey verwenden, wenn das n ist o Problem.

+0

Dies wird definitiv den Trick machen, aber es erfordert die Implementierung der Schnittstelle als Stub/Mock im Testprojekt. Ich weiß nicht, ob das die Idee ist ... –

+0

Ich kann mir vorstellen, dass es nicht die Idee ist ... aber ich konnte keine andere Lösung sehen. Wenn Sie sich den Quellcode ansehen, den das Fakes-Framework generiert, ist der generische Parameter vom Typ ISecuredItem, nicht von StubISecuredItem. Ich würde fast sagen, das ist ein Bug im Framework. Und die Implementierung im Testprojekt kann dazu führen, dass alle Methoden eine NotImplementedException auslösen, so dass es nicht zu lange Zeit kostet, sie zu erstellen. –

+0

Ich weiß, ich stimme völlig zu. Die Antwortlösung, die mir automatisch in den Sinn kam, ist diejenige, die Sie erwähnt haben. –

Verwandte Themen