Ho una classe che restituisce un semplice file di report. Legge alcuni numeri ID record da un file XML: ognuno utilizzato per trovare un record corrispondente memorizzato in un database. Quindi scrive i dettagli di ogni record in un file CSV.Unità di test di una classe che utilizza il file system
Mi chiedo: qual è il modo migliore per organizzarlo in modo che sia facile da testare, ma segue i principi dell'incapsulamento? Capisco che è meglio evitare di interagire con il file system a meno che non sia assolutamente necessario, quindi mi occupo di oggetti Stream. Quando collaudo unità, posso usare oggetti simulati parziali per sovrascrivere i bit che leggono o scrivono sui file.
Sono anche sicuro di quando/dove disporre i flussi senza rendere difficile il test dell'unità. Sembra che potrei dover esporre i flussi al test unitario.
Il mio progetto utilizza NHibernate per l'accesso ai dati, Spring .NET per l'iniezione delle dipendenze e Rhino.Mocks per il test delle unità.
Attualmente ho qualcosa di simile a questo:
public class ReportBiz
{
//Access to repository, populated by Spring
internal ICardRequestDAO CardRequestData { get;set;}
//This normally returns a FileStream containing data from the XML file. When testing this is overridden by using a Rhino.Mocks partial mock and returns a MemoryStream
internal virtual Stream GetSourceStream()
{
//Load file and return a Stream
...
}
//This normally returns a FileStream where CSV data is saved. When testing this is overridden by using a Rhino.Mocks partial mock and returns a MemoryStream
internal virtual Stream GetOutputStream()
{
//Create file where CSV data gets saved and return a Stream
...
}
public void CreateReportFile()
{
Stream sourceStream = GetSourceStream();
...
//Create an XmlDocument instance using the stream
//For each XML element, get the corresponding record from the database
//Add record data to CSV stream
...
}
}
sarebbe meglio utilizzare un qualche tipo di fabbrica su misura o qualcosa e passare i corsi d'acqua nel costruttore? Ma che cosa succede se c'è qualche logica aziendale, ad es. il nome del file viene determinato in base ai risultati di una query?
Oppure l'intero problema dell'accesso ai file non è un problema?
Mi scuso se mi manca qualcosa di ovvio. Sarei grato per qualsiasi consiglio.
Ho bisogno di chiedere: cosa fa il tuo XML? Contiene solo un elenco di chiavi che puntano a un record del database? –
Oltre alla chiave del database, contiene altri tre campi necessari per il record. Anche questi vengono utilizzati nella relazione. – James
Correlati: http://stackoverflow.com/questions/129036/unit-testing-code-with-a-file-system-dependency –