9

Supponiamo che la mia classe Foo ha il seguente:Unit Testing costruttore iniezione

readonly IService service; 

public Foo(IService service) 
{ 
    if (service == null) 
     throw new ArgumentNullException("service"); 

    this.service = service; 
} 

public void Start() 
{ 
    service.DoStuff(); 
} 

Finora, ho uno unit test per il costruttore in cui passo in nulla di verificare che ArgumentNullException viene buttato. Ho bisogno di un secondo test di unità per il mio costruttore dove passo in un IService valido e verificare che venga impostato this.service (che richiederebbe un accesso pubblico)?

Oppure dovrei semplicemente affidarmi al mio test dell'unità per il metodo Start per testare questo percorso di codice?

risposta

12

L'impostazione this.service è un dettaglio di implementazione, quindi è sufficiente verificare che venga utilizzato dove previsto e testarlo tramite il metodo Start. Affinché i test non diventino fragili.

Si desidera solo verificare che il servizio sia utilizzato in modo appropriato. Non dovresti preoccuparti di come è immagazzinato.

9

Questi test sono ridondanti, poiché nessun altro test avrà esito positivo quando il costruttore non funziona.

E a dire il vero, non mi preoccupo nemmeno di scrivere quei controlli nulli nei miei costruttori. La ragione è semplice: i contenitori DI non ti permettono di collegare automaticamente costruttori con riferimenti null (o almeno, non di default), quindi non c'è possibilità che i tipi vengano costruiti usando valori nulli (quando sono collegati automaticamente da un contenitore) . Quindi aggiunge solo un codice inutile che mi fa aggiungere test inutili quando voglio avere una copertura di codice alta.

Io dico saltare completamente questi controlli null e considerare attendibile il contenitore DI (o selezionare un contenitore DI di cui ci si può fidare).

+0

Qualcos'altro che puoi fare è rimuovere completamente il Ctor e lasciarlo generare da un modello T4, come questo progetto: https://t4ctorgenerator.codeplex.com/. Non è necessario il codice generato dall'unità di test. – Steven