2011-09-22 11 views
5

Ho il seguente problema, voglio usare Ninject nei miei test di unità. I miei pensieri su questo erano come questo:Override Il binding di Ninject localmente all'interno di un metodo di prova per associare oggetti fittizi

1) Definire uno schema vincolante globale all'interno di un modulo per legare i miei oggetti falsi che uso all'interno dei test

2) Quando si utilizza un oggetto fittizio legano a livello locale all'interno del test

Non ho trovato un modo per sovrascrivere localmente la configurazione di binding, la mia idea è che creo localmente un oggetto mock con aspettative e voglio il metodo kernel.Get() per restituire un oggetto che ha tutto il binding in posto salvo che ogni test aggiunge un oggetto mock locale all'interno di un test con aspettative, questo mi sembra leggibile e mantenibile, dato che ho solo la precedenza su 1 rilegatura per test, gli oggetti ar e mazzi quindi non possono essere configurati all'interno del modulo come il contesto di test è sconosciuto

Come posso realizzare questo, sto usando C# e nunit. Se la mia metodologia è sbagliata mi piacerebbe sentire quella giusta.

risposta

3

Non si deve utilizzare il contenitore IoC per creare l'oggetto che si desidera testare nei test dell'unità. Invece, crealo manualmente usando new e passa un oggetto di simulazione/stub per ogni argomento del costruttore.

+1

Oppure prendere in considerazione l'utilizzo di http://autofixture.codeplex.com –

+1

o considerare l'utilizzo di AutoMoq - https: // github.com/darrencauthon/AutoMoq – viggity

+3

Cosa succede se ciò che si sta testando è la validità dei collegamenti DI e si deve sovrascrivere un collegamento che non riesce a meno che non si trovi nell'ambiente dell'applicazione (ad esempio, un binding a un servizio di configurazione che cercherà i file di configurazione)? –

35

Ho lo stesso problema e capisco che non è il modo migliore per fare, ma dalla mia parte, faccio test di integrazione; non test unitari.

Ecco la mia soluzione:

Kernel.Rebind<TypeToBind>().ToConstant(Mock.Object); 

Dove Kernel è l'oggetto che hai utilizzato per creare l'associazione. TypeToBind è il tipo che si desidera inietta la dipendenza. Mock.Object è l'oggetto che è stato precedentemente configurato.

Ancora una volta, so che non è molto bello, ma mentre si lavora su un codice legacy in cui i test di unità sono difficili da inserire, potrebbe essere una salvezza avere una buona rete di sicurezza.

+4

Penso che sia perfettamente corretto fare qualcosa del genere io stesso tutti i nostri test lo fanno. In effetti, AtUnit in Java è stato inventato per utilizzare esclusivamente un framework DI per i test delle unità;). –

2

Penso che usare il framework IoC per i test sia il modo perfetto per farlo. Di fatto, ecco perché IoC esisteva in primo luogo e poi sono arrivati ​​i quadri. Guice (framework DI di java injection di google) in realtà supporta questa funzione in cui si passa al modulo con i binding di produzione e si passa in un TestModule che può sovrascrivere determinati binding con mockobject e quindi è possibile testare. Lo stiamo facendo ed è stato molto pulito da molto tempo in Java. Sto cercando di riassestare le cose e mantenere il resto degli attacchi ....

Esistono anche framework come AtUnit in cui si suppone che si stia utilizzando il framework DI per testare gli oggetti e NON utilizzare la nuova parola chiave (purtroppo non vedo ancora una porta di quella struttura su C#:

NOTA: il motivo è desiderabile quando le persone aggiungono una nuova rilegatura in produzione modulo e quindi utilizzarlo in uno dei miei sistemi in classi di test, non fallisce con le eccezioni di nullpointer perché non è stata associata un'interfaccia nel test.le persone continuano ad aggiungere e il test continua a funzionare.Per mio parere, si dovrebbe usare solo il parola chiave "nuovo" con dtos e tali di questi giorni e tutta la logica di biz dovrebbe essere cablata con DI rendendola facile t o aggiungere test ora o in un secondo momento abbastanza facilmente (anche se mi piace aggiungere test prima io stesso).

Problemi correlati