6

Sto usando il framework dell'iniezione delle dipendenze Simple Injector e sembra interessante e piacevole. Ma dopo aver creato una configurazione e averla utilizzata, ora voglio sapere come passare da una configurazione all'altra.Usa diverse configurazioni con Simple Injector

Scenario: Immaginiamo che ho impostare una configurazione nella Asax globale e ho il pubblico e globale Container esempio ci. Ora voglio fare alcuni test e voglio che usino le classi di simulazione, quindi voglio cambiare la configurazione.

Posso, ovviamente, creare un'altra configurazione e assegnarla al globale Container creato di default, in modo che ogni volta che eseguo un test venga impostata la configurazione alternativa. Ma, facendo ciò, e anche se sono in un contesto di sviluppo, lo Container viene modificato per tutti, anche per le richieste normali. So che sto provando in questo contesto e questo non dovrebbe avere importanza, ma ho la sensazione che questo non sia il modo di farlo ... e mi chiedo come passare da una configurazione all'altra nel modo corretto.

+0

Stai parlando di installazione di test automatici?Se è così, ricostruisci il contenitore (usando i mock dove necessario) prima di ogni caso di test. Questo è '[TestInitialize]' in MSTest e '[SetUp]' in NUnit. –

risposta

6

Durante i test di unità, non utilizzare il contenitore. Basta creare la classe sotto test chiamando il suo costruttore e fornendogli gli oggetti mock appropriati.

Uno schema che mi ha aiutato molto in passato è l'uso di un semplice metodo di prova specifico per classe. Questo metodo centralizza la creazione della classe sottoposta a test e riduce al minimo la quantità di modifiche da apportare quando le dipendenze della classe in prova cambiano. Questo è il modo come metodo factory potrebbe apparire come:

private ClassUnderTest CreateValidClassUnderTest(params object[] dependencies) 
{ 
    return new ClassUnderTest(
     dependencies.OfType<ILogger>().SingleOrDefault() ?? new FakeLogger(), 
     dependencies.OfType<IMailSender>().SingleOrDefault() ?? new FakeMailer(), 
     dependencies.OfType<IEventPublisher>().SingleOrDefault() ?? new FakePublisher()); 
} 

Per i test di integrazione è molto più comune l'uso del contenitore, e scambiare alcune dipendenze del contenitore. Tuttavia, tali test di integrazione non utilizzeranno il contenitore che hai creato nel tuo application_start, ma in ogni caso il test di integrazione avrà probabilmente la sua nuova istanza contenitore, poiché ogni test dovrebbe essere eseguito separatamente. E anche se hai utilizzato un singolo contenitore da application_start, i test di integrazione vengono eseguiti da un progetto separato e non interferiscono con la tua applicazione in esecuzione.

Sebbene ogni test di integrazione debba ottenere la propria istanza contenitore (se presente) si desidera comunque riutilizzare il più possibile il codice di configurazione del contenitore. Questo può essere fatto estraendo questo codice a un metodo che restituisce una nuova istanza contenitore configurata quando viene chiamata, oppure configura un'istanza contenitore fornita (e non restituisce nulla). Questo metodo dovrebbe in genere eseguire una configurazione incompleta e il chiamante (i test o l'asax globale) dovrebbe aggiungere le configurazioni mancanti.

Estrazione di questo codice: consente di avere più applicazioni finali che condividono in parte la stessa configurazione; ti permette di verificare il contenitore in un test di integrazione; e consente di aggiungere servizi che devono essere presi in giro dai test di integrazione.

Per semplificarti la vita, Simple Injector ti consente di sostituire le registrazioni esistenti con una nuova (ad esempio una beffa). È possibile abilitare questo come segue:

container.Options.AllowOverridingRegistrstions = true; 

Ma attenzione con questo! Questa opzione può nascondere il fatto che si ignora accidentalmente una registrazione. Nella mia esperienza, nella maggior parte dei casi è molto meglio costruire un contenitore incompleto e aggiungere successivamente le registrazioni mancanti invece di sovrascriverle. Oppure, se decidi di eseguire l'override, attiva la funzione all'ultimo momento possibile per evitare errori di configurazione accidentali.

+0

Grazie. Sembra essere quello che stavo immaginando. –

Problemi correlati