2012-10-01 9 views
8

Sto usando Microsoft Fakes in alcuni test di unità su cui sto lavorando. La mia interfaccia si presenta così:Come si fa riferimento a uno stub che ha un parametro generico di se stesso usando Microsoft Fakes?

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

Una tipica implementazione di questo appare come:

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

mi piacerebbe utilizzare questa interfaccia con Microsoft falsi, e lo hanno generare uno stub per me. Il problema è che il modulo utilizzato da Fakes è StubInterfaceNameHere<>, quindi nell'esempio sopra si finisce per provare a fare qualcosa come StubISecuredItem<StubISecuredItem<StubISecuredItem<StubISecuredItem....

È possibile? Se è così, come faccio a usare i falsi in questo modo?

risposta

5

Dopo alcuni esperimenti ho trovato una soluzione funzionante anche se non è la più elegante.

Questo è il tuo codice di regolare:

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

Nel progetto di test si crea un'interfaccia StubImplemtation

public interface StubImplemtation : ISecuredItem<StubImplemtation> { } 

Poi, nel tuo test di unità è possibile effettuare le seguenti operazioni:

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

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

È possibile saltare l'intero StubImplementation e utilizzare RegistryKey se questo è n o problema

+0

Questo sicuramente farà il trucco, ma richiede l'implementazione dell'interfaccia come stub/mock nel progetto di test. Non so se sia l'idea ... –

+0

Posso immaginare che non è l'idea .. ma non ho potuto vedere alcuna altra soluzione. Quando si guarda il codice sorgente generato dal framework Fakes, il parametro generico è di tipo ISecuredItem, non di StubISecuredItem. Direi quasi che è un bug nel framework. E l'implementazione nel progetto di test può avere tutti i metodi per lanciare NotImplementedException, quindi non dovrebbe costare molto tempo per la creazione. –

+0

Io sono d'accordo, sono assolutamente d'accordo. La soluzione di risposta che mi è venuta in mente automaticamente è quella che hai menzionato. –

Problemi correlati