Тест с использованием каталога не удался - PullRequest
1 голос
/ 21 октября 2019

Мой тест не пройден. Возвращенная коллекция, возвращенная методом GetFiles, пуста, и я не знаю почему.

Вот мой класс :

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);
}

1 Ответ

4 голосов
/ 21 октября 2019

Переместите настройку перед созданием экземпляра смоделированного объекта:

//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, а затем удалить его. из фактического модульного теста:

[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...
}
...