2009-07-02 12 views
11

Sto provando a testare alcune classi che ho creato usando i mock, ma ho visto tutti i framework di derisione gratuiti in C# non sono in grado di simulare metodi non virtuali (se è non in un'interfaccia).Mocking metodi non virtuali in C#

Ma c'è TypeMock che può farlo, quindi è possibile. Qualcuno può mostrare come farlo? Potrei anche provare a contribuire a un framework open source se posso ottenere questo risultato.

Grazie in anticipo

+0

La migliore ipotesi, una combinazione di AppDomains, Reflection.Emit e un bel po 'di hackery e magia. Ma non sono qualificato per fare molte ipotesi plausibili su questo. –

+0

aggiunto tag typemock – BengtBe

+0

Vedere anche http://stackoverflow.com/questions/2187513/how-to-make-a-unit-test-mock-of-an-object-with-non-virtual-functions/6690183 –

risposta

7

Secondo la website usa AOP per reindirizzare chiamate:

Typemock isolatore utilizza tecnologia orientata agli aspetti di reindirizzare chiamate dal codice reale. Ciò consente agli sviluppatori di definire il comportamento del componente esterno richiesto per uno scenario testato. Ad esempio, è possibile simulare che il disco sia pieno quando si scrive su un database istruendo Typemock Isolator per lanciare un'eccezione OutOfDiskSpaceException durante la scrittura nel database. Questo è uno scenario che sarà quasi impossibile da testare senza Typemock Isolator. Lo sviluppatore definisce il comportamento nel test unitario effettivo e Typemock Isolator isola automaticamente tutti i componenti necessari.

Questa tecnica richiede di configurare un ambiente speciale prima di poter eseguire il test o utilizzare un plug-in VS.

Alcune persone pensano che la capacità di prendere in giro tutto rende Typemock troppo potente, dal momento che non si deve pensare tanto al buon design. Una citazione da Ayende:

La debolezza principale del tipo Mock è il suo potere, che mi permette di prendere scorciatoie che non voglio prendere, voglio ottenere un sistema con accoppiamento basso e alta coesione.

Ma, naturalmente, dal momento che egli è il creater di Rhino Mock egli non è :) obiettivo

penserei ci si trova in una grande quantità di lavoro, se si desidera creare un quadro di scherno con questa funzionalità , quindi consiglierei di acquistare Typemock, o di imparare a codificare senza :)

+0

You ho bisogno di creare un ambiente speciale prima di eseguire TypeMock (c'è anche un plugin VS per questo), e sono d'accordo sul fatto che TypeMock abbia "una corda più che sufficiente per impiccarti" –

+0

Grazie Blair, ha aggiornato il post per riflettere il tuo commento! – BengtBe

+0

Beh, immagino che gli scenari principali per il typemock siano se hai bisogno di lavorare con un sistema legacy o di terze parti dove non puoi (facilmente) cambiare il design e vuoi ancora aggiungere test unitari e prendere in giro certe cose. – ChrisWue

14

Io vengo da Typemock e non affronterò i commenti "troppo potente" (anche se è oltre me perché la gente non vorrebbe usare lo strumento migliore per il lavoro).

Ecco come funziona Typemock Isolator. Hai mai usato un profiler delle prestazioni? Isolatore è un profiler. Si aggancia al CLR e all'interno del tempo di esecuzione del test, cambia i metodi. Quando un metodo diventa JITted, lo cambia, quindi quando il metodo viene eseguito, prima di eseguire il codice originale, chiede: dovrei eseguirlo come originariamente previsto, e in caso contrario, cosa dovrei fare? E grazie a questa tecnologia specifica, può prendere in giro qualsiasi metodo e tecnologia .Net. Questo è tutto.

Quando si imposta un comportamento utilizzando l'API, la risposta alle domande diventa ora interessante e modifica il comportamento in fase di esecuzione di tale metodo. Semplice, ma sotto le coperte è un sacco di lavoro :)

Isolator viene fornito con un AddIn VS per eseguire i test senza soluzione di continuità all'interno di VS e con uno strumento da riga di comando e attività MSBuild o NAnt per l'utilizzo in un server di build.

Sarò felice di rispondere a qualsiasi altra domanda tu possa avere.

+2

Devi essere davvero bravo a non tagliarti quando usi coltelli affilati! ;). Immagino sia quello che intendevano con i commenti "troppo potenti". –

Problemi correlati