使用目录测试失败

Test using Directory failing

我的测试失败了。 GetFiles方法返回的集合为空,不知道为什么。

这是我的 class:

public class FileNamesProvider : IFileNamesProvider
{
    private readonly IDirectory _directoryWrapper;
    private readonly IReadOnlyList<string> _fileNames;

    public FileNamesProvider(IDirectory directoryWrapper)
    {
        _directoryWrapper = directoryWrapper;

        var folder = GetFolderOfExecutingAssembly();

        _fileNames = GetFileNamesFromPatternFilesFolder(folder);
    }

    public IReadOnlyList<string> GetFileNamesForPatternFiles() => _fileNames;

    private string GetFolderOfExecutingAssembly() =>
        new Uri(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? throw new InvalidOperationException()).LocalPath;

    private IReadOnlyList<string> GetFileNamesFromPatternFilesFolder(string folder) => _directoryWrapper.GetFiles($"{folder}\patterns", "*.txt");
}

还有我的测试:

[TestFixture]
public class FileNamesProviderTests
{
    private Mock<IDirectory> _fakeDirectoryWrapper;

    [SetUp]
    public void SetUp()
    {
        _fakeDirectoryWrapper = new Mock<IDirectory>();
    }

    [Test]
    public void GetFileNamesForPatternFiles_ReturnsExpectedFileNamesInCorrectCollectionType()
    {
        //Arrange
        var fileNamesProvider = new FileNamesProvider(_fakeDirectoryWrapper.Object);
        _fakeDirectoryWrapper.Setup(_ => _.GetFiles(It.IsAny<string>(), It.IsAny<string>()))
            .Returns(new[] { "a.txt", "b.txt" });

        //Act
        var result = fileNamesProvider.GetFileNamesForPatternFiles();

        //Assert
        Assert.AreEqual(new[] { "a.txt", "b.txt" }, result);
        Assert.That(result.GetType() == typeof(IReadOnlyList<string>));
    }
}

这是 包装器

public class DirectoryWrapper : IDirectory
{
    public DirectoryWrapper()
    {
    }

    public string[] GetFiles(string path, string searchPattern) => Directory.GetFiles(path, searchPattern);
}

在创建模拟对象的实例之前移动设置:

//setup
_fakeDirectoryWrapper.Setup(_ => _.GetFiles(It.IsAny<string>(), It.IsAny<string>()))
                     .Returns(new[] { "a.txt", "b.txt" });
//then create mocked object
var fileNamesProvider = new FileNamesProvider(_fakeDirectoryWrapper.Object);

您真的应该在 SetUp 方法中执行模拟 methods/properties/events 的任何设置,然后您可以将其从实际单元测试中删除:

[SetUp]
public void SetUp()
{
    _fakeDirectoryWrapper = new Mock<IDirectory>();

    // setup GetFiles
    _fakeDirectoryWrapper.Setup(_ => _.GetFiles(It.IsAny<string>(), It.IsAny<string>()))
                         .Returns(new[] { "a.txt", "b.txt" });

    // setup any other methods...
}