将 System.IO.Abstractions 与 DirectoryInfo 结合使用

use*_*961 4 c# moq

如何使用 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”不存在。

这是因为我做得不对还是无法做到?

Lau*_*oun 9

您可以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)