Mi considero un 'mockist' sul dibattito 'mockista' contro 'classicista', ma sto cercando di capire l'altro punto di vista.
Immagina di avere questa classe, in cui un'istanza concreta di IDependency
viene iniettata da un contenitore IoC.
IDependency
non accede a una risorsa remota come un database o un servizio web (nel qual caso definirò definitivamente il mocking), è solo un'altra classe contenente alcune logiche di business.
public class UnitUnderTest
{
public UnitUnderTest ( IDependency dependency )
{
}
}
Usando questo modello, sono libero di cambiare l'implementazione concreta di IDependency
cambiando la classe iniettata dal contenitore IoC. Non sono legato a nessuna particolare implementazione.
Se dovessi testare questa classe senza il mocking IDependency
, non dovrei istanziare il reale IDependency
da passare al costruttore?
public class My_Unit_Test()
{
IDependency concreteDependency = new ConcreteDependency();
var unitUnderTest = new UnitUnderTest(concreteDependency);
}
In questo esempio, se scrivo una sostituzione a ConcreteDependency
, dovrei non solo cambiare la configurazione del mio contenitore IoC, ma tutti i miei test unitari che usano ConcreteDependency
.
Oppure ... utilizzo lo stesso contenitore IoC all'interno dei miei test di unità (che sembra contrario all'idea di testare le cose in isolamento)?