2013-04-04 14 views
5

Ho una configurazione di classe nel modo seguente:Microsoft Fakes supporta metodi astratti su uno spessore?

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

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

    public abstract WhatIWantToShim(); 
} 

Quello che voglio fare è impostare il WhatIWantToShim sulle ShimFooClass in questo modo:

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

posso impostare RandomMethod bene,

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

Tuttavia, sembra che ShimFooClass generato non crei la proprietà WhatIWantToShim sulla proprietà AllInstances di ShimFooClass.

Ho guardato allo http://msdn.microsoft.com/en-us/library/hh549176.aspx#bkmk_shim_basics ma non vedo nulla in merito ai metodi astratti. L'unica cosa che vedo referenziata non supportata sono i finalizzatori. Qualcuno sa cosa sta succedendo qui e se questo scenario è supportato?

+0

È possibile creare un metodo che imposta la proprietà? – RedJandal

+0

Non ti segue, non c'è una proprietà per il metodo astratto creato sulla classe shim. Quello è il problema. –

risposta

4

Ahhh .... più scadente

interfacce e metodi astratti. Gli stub forniscono implementazioni di interfacce e metodi astratti che possono essere utilizzati nei test. Gli shim non possono strumentare interfacce e metodi astratti, perché non hanno corpi metodo.

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

Aggiornamento: cosa si può fare se si stubbing lo spessore.

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."); 
} 

Dato che lo spessore non può gestire deviando il metodo WhatIWantToShim e lo stub può, basta creare una nuova istanza della classe stub e impostare il gestore deviazione per il metodo astratto. (Nota: il 01 tagged alla fine di WhatIWantToShim è stato aggiunto automaticamente per me quando i Fakes sono stati generati nel mio codice reale).

Quindi passare lo stub istanziato al costruttore della classe shim e allontanare secondo necessità.

0

Sto rispondendo qui perché sono abbastanza sicuro che l'altra risposta non ha risposto alla domanda e in modo che le ricerche future restituiscano informazioni utili.

In primo luogo, non è possibile eseguire lo shim delle interfacce. Un metodo astratto è equivalente a un'interfaccia. Inoltre, non c'è motivo di farlo.

{ 
    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."); 
} 

Quanto sopra è una versione semplificata di una risposta precedente e chiamerà semplicemente l'azione appena assegnata. Questo probabilmente non è il tuo intento.

Ricordare PERCHÉ si spigola. Si shim quando si desidera evitare gli effetti di una chiamata di metodo all'interno di un metodo che si sta testando. Il metodo astratto non può avere corpo e quindi non può influenzare nulla. L'unica volta che ciò sarebbe utile è in una classe di bambini, dove lo shim sarebbe disponibile per te in primo luogo.

L'unica situazione in cui si potrebbe avere un problema è se una terza classe tiene segretamente un'istanza della classe astratta e l'istanziazione con la classe figlio. Non puoi fingere questo. È, tuttavia, un design terribile; l'istanza dovrebbe provenire da un metodo (che è possibile shim) o passato (perché DI è una buona cosa!) altrimenti l'astrazione è senza valore, e si può anche avere l'istanza dichiarata come il tipo di bambino, dal momento che non si sta utilizzando l'astrazione in alcun modo.

Problemi correlati