为了使代码更具可测试性,注入IOWrapper
作为依赖项。您可以通过在其上声明接口IOWrapper
或使方法虚拟化来使其可模拟。在您的测试期间,您可以注入模拟而不是具体实例,并使您的测试成为真正的单元测试。
public class CSVFileFinder
{
private readonly IOWrapper ioWrapper;
private readonly string folderPath;
public CSVFileFinder(string folderPath)
: this(new IOWrapper(), folderPath)
{
}
public CSVFileFinder(IOWrapper ioWrapper, string folderPath)
{
this.ioWrapper = ioWrapper;
this.folderPath = folderPath;
}
public IEnumerable<string> FetchFiles()
{
return this.ioWrapper.GetFiles(folderPath, "*.csv", SearchOption.AllDirectories);
}
}
这是一个示例单元测试,它验证 的结果IOWrapper
是从GetFiles
. 这是使用Moq
和编写的NUnit
。
[TestFixture]
public class FileFinderTests
{
[Test]
public void Given_csv_files_in_directory_when_fetchFiles_called_then_return_file_paths_success()
{
// arrange
var inputPath = "inputPath";
var testFilePaths = new[] { "path1", "path2" };
var mock = new Mock<IOWrapper>();
mock.Setup(x => x.GetFiles(inputPath, It.IsAny<string>(), It.IsAny<SearchOption>()))
.Returns(testFilePaths).Verifiable();
var testClass = new CSVFileFinder(mock.Object, inputPath);
// act
var result = testClass.FetchFiles();
// assert
Assert.That(result, Is.EqualTo(testFilePaths));
mock.VerifyAll();
}
}
然后,您可以为边缘条件添加测试,例如 IOWrapper 抛出异常或没有返回文件等。IOWrapper
使用它自己的一组测试单独测试。