Voglio creare il codice testabile dell'unità che prende in giro le chiamate alle classi .Net System.IO, così posso davvero testare l'unità invece che a seconda del filesystem. Sto usando le classi SystemWrapper per fare il giro delle classi BCL.Come creare codice verificabile usando le classi IO .Net?
Sto cercando di ottenere un semplice esempio di funzionamento per vedere se esiste un file.
Il problema che sto avendo è che l'iniezione di dipendenza nella classe non funziona perché istanziare la dipendenza (attraverso StructureMap) richiede sapendo cosa parametro del costruttore passare, che non sarà disponibile in quel momento, v'è anche nessun costruttore predefinito.
codice di esempio:
// don't want to create dependency here like so
//IFileInfoWrap fileInfoWrap = new FileInfoWrap(filename);
// using service locator (anti-pattern?!) since it can't be
// injected in this class
var fileInfoWrap = ObjectFactory.GetInstance<IFileInfoWrap>(
new ExplicitArguments(new Dictionary<string, object>
{
{"fileName", filename}
}));
Console.WriteLine("File exists? {0}", fileInfoWrap.Exists);
Quello che non mi piace è che la dipendenza non è iniettato, ObjectFactory non dovrebbe essere qui (ma non vedo altro modo per creare questo). ExplicitArguments lo rende caotico e il nome-argomento è una stringa magica.
per me per ottenere questo al lavoro di classe StructureMap config ha bisogno di sapere explict quale costruttore voglio usare (ho appena iniziato con StructureMap quindi questo potrebbe non essere il modo giusto per configurarlo):
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.AssembliesFromPath(".");
scan.RegisterConcreteTypesAgainstTheFirstInterface();
scan.WithDefaultConventions();
});
// use the correct constructor (string instead of FileInfo)
x.SelectConstructor(() => new FileInfoWrap(null as string));
// setting the value of the constructor
x.For<IFileInfoWrap>()
.Use<FileInfoWrap>()
.Ctor<string>("fileName")
.Is(@".");
});
Qualcuno ha trovato una soluzione migliore per creare codice verificabile contro le classi System.IO? So parte del problema è nella progettazione delle classi System.IO.
SystemWrapper contiene astrazioni per lo più estremamente perde. Sarebbe molto più semplice e più semplice modellare IO in streaming, TextWriter, TextReader, ecc. Queste classi sono già astratte, eliminando completamente la necessità di SystemWrapper. –
Un altro voto per i flussi –
I miei risultati con SystemWrapper sono che sembra essere un buon wrapper con interfacce, tuttavia è ancora un vicolo cieco a causa del modo in cui funzionano le classi originali. Ad esempio, la restituzione di un array di oggetti FileInfo non può essere corretta in modo corretto. Rotolando il mio involucro più semplificato che non deve imitare le classi esistenti, mentre più lavoro porta a una soluzione praticabile IMHO. –