Modificare il codice per poterlo verificare non ha nulla di sbagliato. In effetti, uno dei punti di TDD e dei test unitari in generale è di incoraggiarti a scrivere un codice più gestibile.
D'altro canto, il tuo esempio illustra i test di integrazione, di sistema o funzionali, non i test di unità. Nei test unitari, i test sono il più possibile indipendenti dall'ambiente, il che, nel tuo caso, significa che non ci si aspetta che crei una directory di test con i file di test al suo interno ai fini del test dell'unità (a meno che il tuo test dell'unità non si concentri specificamente su una classe che legge i file).
Hai già fatto il primo passo dell'introduzione di Dependency Injection in CSVImporter
quando si tratta di FileUtil
, e questo è ottimo. Il prossimo passo è creare uno stub FileUtilStub
che implementa l'interfaccia IFileUtil
, ma non fa nulla con i file reali: restituisce semplicemente i dati demo. Ad esempio, quando elenchi i file, potrebbe restituire ["file1.txt", "file2.txt"]
e, durante la lettura di qualsiasi file, potrebbe restituire Hello,World
.
Ora vengono i casi limite. Dato che stai testando materiale CSV, cosa succede se crei uno stub% diversoFileUtilEmptyFileStub
che restituisce una stringa vuota quando richiesto per caricare un file? Un FileUtilEmptyListStub
può restituire una lista vuota di file. Altri possono restituire file molto lunghi o file con caratteri Unicode, ecc., Per sapere come la classe gestisce tali casi.
Un ulteriore refactoring può consistere nella creazione di uno stub che prende come parametro un elenco di file e contenuti di file. Ciò rende possibile scrivere meno codice mentre si inserisce tutto il codice pertinente all'interno del corpo del test dell'unità stessa:
public void TestEmptyList()
{
var stub = new FileUtilStub([], "hello,world");
var importer = new CSVImporter(stub);
// Do something with the importer and assert.
}
public void TestListWithNewlineInNames()
{
var stub = new FileUtilStub(["file\n.txt"], "hello,world");
var importer = new CSVImporter(stub);
// Do something with the importer and assert.
}
...