Introduction
On many occasions I come accross code that is tightly coupled to the file system. Here is an example of an import functionality using a CSV file read out:
using System.Collections;
using System.IO;
public class DealershipImporter
{
public List<Dealership> Import(string dealershipCatalogCsvPath)
{
var dealerships = new List<Dealership>();
var catalogLines = File.ReadAllLines(dealershipCatalogCsvPath);
foreach(var csvLine in catalogLines)
{
dealerships.Add(new Dealership(csvLine));
}
return dealerships;
}
}
[TestFixture]
public class DealershipImporterTests
{
[Test]
public void ShouldImportDealershipsFromValidCsvFile()
{
// Arrange
const int ExpectedNumberOfDealerships = 5;
var dealershipImporter = new DealershipImporter();
// Act
var dealerships = dealershipImporter.Import(@".\TestFiles\top_five_dealerships.csv");
// Assert
Assert.AreEqual(ExpectedNumberOfDealerships, dealerships.Count);
}
}
Class diagram:
using System.Collections;
using System.IO.Abstraction;
public class DealershipImporter
{
private IFileSystem fileSystem;
public DealershipImporter()
{
this.fileSystem = new FileSystem(); // uses real System.IO implementation
}
public DealershipImporter(IFileSystem fileSystem)
{
this.fileSystem = fileSystem;
}
public List<Dealership> Import(string dealershipCatalogCsvPath)
{
var dealerships = new List<Dealership>();
var catalogLines = fileSystem.File.ReadAllLines(dealershipCatalogCsvPath);
foreach(var csvLine in catalogLines)
{
dealerships.Add(new Dealership(csvLine));
}
return dealerships;
}
}
[Test]
public void ShouldImportDealershipsFromValidCsvFile()
{
// Arrange
const int ExpectedNumberOfDealerships = 5;
const string TestFilePath = @"c:\top_file_dealership.csv";
// Specify test input file up front by using MockFileSystem
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
{
{ TestFilePath, new MockFileData("Dealer 1" + Environment.NewLine + "Dealer 2 ...") }
});
// Inject the mock into the Importer class
var dealershipImporter = new DealershipImporter(fileSystem);
// Act
var dealerships = dealershipImporter.Import(TestFilePath);
// Assert
Assert.AreEqual(ExpectedNumberOfDealerships, dealerships.Count);
}