如何使用 Moq for 编写单元测试DirectoryInfo?我的班级如下:
public class DataProcessor : IDataProcessor, IDisposable
{
private ILogger _logger;
DataProcessor(ILogger logger)
{
_logger = logger;
}
public async Task Run(string filePath)
{
var dir = new DirectoryInfo( filePath);
var filesInDir = dir.GetFiles("*.xml");
foreach(var filePath in filesInDir)
{
// process file
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用 System.IO.Abstractions 并按如下方式更改了我的类,但DirectoryInfo不适用于 System.IO.Abstractions
public class DataProcessor : IDataProcessor, IDisposable
{
private readonly IFileSystem _fileSystem;
private ILogger _logger;
DataProcessor(ILogger logger) : this(new FileSystem())
{
_logger = logger;
}
internal DataProcessor(IFileSystem fileSystem)
{
_fileSystem = fileSystem;
}
public async Task Run(string filePath)
{
var dir = new _fileSystem.DirectoryInfo(filePath);// ERROR HERE
var filesInDir = dir.GetFiles("*.xml");
foreach(var filePath in filesInDir)
{
// process file
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
名称或命名空间名称“_fileSystem”不存在。
这是因为我做得不对还是无法做到?
您可以IDirectoryInfo使用以下方法实例化对象:
IDirectoryInfo directory = _fileSystem.DirectoryInfo.FromDirectoryName(filePath);
Run Code Online (Sandbox Code Playgroud)
所以你的完整代码将如下所示:
public class DataProcessor : IDataProcessor, IDisposable
{
private readonly IFileSystem _fileSystem;
private ILogger _logger;
DataProcessor(ILogger logger) : this(new FileSystem())
{
_logger = logger;
}
internal DataProcessor(IFileSystem fileSystem)
{
_fileSystem = fileSystem;
}
public async Task Run(string filePath)
{
var dir = _fileSystem.DirectoryInfo.FromDirectoryName(filePath);
var filesInDir = dir.GetFiles("*.xml");
foreach(var filePath in filesInDir)
{
// process file
}
}
}
Run Code Online (Sandbox Code Playgroud)
至于您的单元测试,我建议遵循其 GitHub 页面System.IO.Abstractions上显示的示例。您可以像这样模拟您的文件系统:
[Test]
public void DataProcessorTestName()
{
// Arrange
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
{
{ @"c:\myfile.txt", new MockFileData("Testing is meh.") },
{ @"c:\demo\jQuery.js", new MockFileData("some js") },
{ @"c:\demo\image.gif", new MockFileData(new byte[] { 0x12, 0x34, 0x56, 0xd2 }) }
});
var dataProcessor = new DataProcessor(fileSystem);
// Test logic here...
}
Run Code Online (Sandbox Code Playgroud)