2010-07-11 23 views
5

Sto tentando di eseguire TDD con un oggetto che ha una dipendenza su un'interfaccia COM. Ho pensato di prendere in giro l'interfaccia COM, mentre eseguivo i test di sviluppo, e lo realizzo nei test di integrazione.Come testare un oggetto dipendente dalla COM in C#

Tuttavia, non riesco a deridere l'interfaccia COM, ho provato con Moq, e viene generata un'eccezione:

System.TypeLoadException è stata gestita dal codice utente Message = Impossibile caricare il tipo Castle.Proxies' .iTunesAppProxy ' dall'assembly' DynamicProxyGenAssembly2, Versione = 0.0.0.0, Cultura = neutra, PublicKeyToken = null '. Il tipo è contrassegnato come idoneo per il tipo equivalenza, ma o ha generici parametri, o non è una struttura, COM importati interfaccia, l'enumerazione, o delegare

E 'possibile con altre strutture? Come si esegue TDD con oggetti COM dipendenti?

Grazie in anticipo! O delegare

+0

quale interfaccia COM è? Quale eccezione è il lancio di Moq? Moq lancia questa eccezione su tutte le interfacce COM o solo su questa? –

+0

L'eccezione è piuttosto generica: System.TypeLoadException non gestito dal codice utente Messaggio = Impossibile caricare il tipo 'Castle.Proxies.iTunesAppProxy' dall'assembly 'DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null '. Il tipo è contrassegnato come idoneo per l'equivalenza di tipo, ma o ha parametri generici oppure non è una struttura, un'interfaccia COM importata, un'enumerazione o un delegato. –

risposta

2

vorrei suggerire che si prende la proprietà dell'interfaccia dell'oggetto COM, questo è dove principio di inversione delle dipendenze entrerebbe in gioco.

Se non si ha accesso alla fonte, sarà necessario creare la propria astrazione che avvolge l'oggetto COM, altrimenti si avranno chiamate di terze parti in tutto il codice.

[EDIT]

Ora l'astrazione dovrebbe essere in grado di essere preso in giro. L'effettiva implementazione del wrapper avrà l'oggetto COM come una relazione HAS-A.

Sarà quindi necessario disporre di un test di integrazione per l'implementazione.

È necessario considerare l'oggetto COM stesso come se fosse qualcosa di simile a un database o un motore di rendering grafico o un servizio Web.

+1

Tuttavia, per fare test usando il mio oggetto wrapper ho ancora bisogno di soddisfare la dipendenza tra il wrapper e l'interfaccia COM, quindi, ho ancora bisogno di deriderlo. –

+0

@iCe - Scusa se non ero chiaro. Pensavo che avessi già deciso di deriderlo. – Gutzofter

+0

Capito, dovrebbe funzionare. Inoltre penso che questo sia un approccio più pulito. Grazie –

1

OK, cosa che non esiste un modo semplice di fare questo, non è sicuro che alcuni dei quadri di scherno potrebbe deridere COM.

Quello che ho in mente ..

Avete qualche interfaccia COM, ISomeThing e oggetto COM implementa questa CoSomeThing interfaccia, questa una vera e propria implementazione. Dovresti implementare ancora un altro componente COM, che implementerebbe la stessa interfaccia, ma in realtà lo prendeva in giro - CoSomeThingMock.

Nel codice viene istanziato CoSomeThingMock, anziché CoSomeThing e utilizzato.

var component = new CoSomeThingMock(); 
var testObject = new Tested(component); 
+0

Quindi, se capisco bene, mi stai suggerendo di fare un finto "manuale". Forse dovrebbe funzionare, ma non è ottimale. –

+0

Hai deciso di non smettere .. manuale, è solo qualcosa che potrei immaginare per questo .. –

+0

Chiunque vuole condividere un'alternativa più automatica? Altrimenti accetterò la risposta di alexanderb, ci ho provato ieri e funziona pienamente. –

5

Provare a impostare "Incorpora tipi di interoperabilità" su FALSE per l'assieme che contiene l'interfaccia COM.

+0

Ho avuto lo stesso problema e l'impostazione di "Incorpora tipi di interoperabilità" a FALSE mi ha aiutato, grazie. –

Problemi correlati