Sto scrivendo un componente che, dato un file ZIP, deve:
- Decomprimi il file.
- Trova una DLL specifica tra i file decompressi.
- Carica quella dll attraverso la riflessione e invoca un metodo su di essa.
Vorrei testare questo componente.
Sono tentato di scrivere codice che si occupa direttamente del file system:
void DoIt()
{
Zip.Unzip(theZipFile, "C:\\foo\\Unzipped");
System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar");
myDll.InvokeSomeSpecialMethod();
}
Ma la gente spesso dice "Non scrivere unit test che si basano su file system, database, rete, ecc."
Se dovessi scrivere questo in un modo test unitario, suppongo che sarebbe simile a questo:
void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
string path = zipper.Unzip(theZipFile);
IFakeFile file = fileSystem.Open(path);
runner.Run(file);
}
Sìì! Ora è testabile; Sono in grado di alimentare doppi di prova (simulazioni) con il metodo DoIt. Ma a quale costo? Ora ho dovuto definire 3 nuove interfacce solo per renderlo testabile. E cosa sto testando esattamente? Sto testando che la mia funzione DoIt interagisce correttamente con le sue dipendenze. Non verifica che il file zip sia stato decompresso correttamente, ecc.
Non mi sembra più di testare la funzionalità. Mi sento come se stessi solo testando le interazioni di classe.
La mia domanda è questa : qual è il modo corretto di testare l'unità che dipende dal file system?
modifica Sto usando .NET, ma il concetto potrebbe applicare anche Java o codice nativo.
myDll.InvokeSomeSpecialMethod();
dove verifichi che funzioni correttamente sia in situazioni di successo che di fallimento, quindi non farei test unitari DoIt
ma DllRunner.Run
detto uso improprio di un test UNIT per ricontrollare che l'intero processo funzioni sarebbe un uso improprio accettabile e poiché si tratterebbe di un test di integrazione mascherato da un test unitario, non è necessario applicare le normali regole di test unitario