Mam klasę, która wyprowadza prosty plik raportu. Odczytuje niektóre numery rekordów z pliku XML: każdy używany do znalezienia pasującego rekordu przechowywanego w bazie danych. Następnie zapisuje dane każdego rekordu w pliku CSV.Jednostka testująca klasę korzystającą z systemu plików
Zastanawiam się - jaki jest najlepszy sposób zorganizowania go tak, aby był łatwy do przetestowania, a jednocześnie przestrzegał zasad enkapsulacji? Uważam, że najlepiej jest unikać interakcji z systemem plików, chyba że jest to absolutnie konieczne, więc mam do czynienia z obiektami Stream. Podczas testowania jednostkowego mogę używać częściowych próbnych obiektów, aby nadpisać bity, które odczytują lub zapisują do plików.
Nie jestem również pewien, kiedy i gdzie wyrzucać strumienie bez konieczności wykonywania testów jednostkowych. Wygląda na to, że muszę wystawić strumienie na test jednostkowy.
Mój projekt wykorzystuje NHibernate do dostępu do danych, Spring .NET do iniekcji zależności i Rhino.Mocks do testowania jednostkowego.
Obecnie mam coś podobnego do tego:
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
...
}
}
Byłoby lepiej użyć jakiegoś niestandardowego fabryce czy coś i przekazać strumienie do konstruktora? Ale jeśli chodzi o logikę biznesową, np. nazwa pliku jest określana na podstawie wyników zapytania?
Czy mimo wszystko nie ma problemu z dostępem do plików?
Przepraszam, jeśli brakuje mi czegoś oczywistego. Byłbym wdzięczny za każdą radę.
Muszę zapytać: co robi twój XML? Czy zawiera tylko listę kluczy wskazujących na rekord bazy danych? –
Oprócz klucza bazy danych zawiera również trzy inne pola, które muszę powiązać z rekordem. Te również zostaną wykorzystane w raporcie. – James
Powiązane: http://stackoverflow.com/questions/129036/unit-testing-code---file-system-dependency –