Verify call to File.Delete with System.IO.Abstractions.TestingHelpers

醉酒当歌 提交于 2021-01-29 06:52:15

问题


I use the System.IO.Abstractions.TestingHelpers to mock FileSystem. In my class, I inject IFileSystem and use the instance to call _fileSystem.File.Exists and _fileSystem.File.Delete. In my test class, I would like to verify that the "Delete" method was called. It's easy by mocking only the IFile, but since I already mocked the FileSystem, I don't want to have to mock the Directory, Path and File on top of it. Is it possible to call something like _fileRepository.FileMock.Verify(x => x.Delete(It.IsAny<string>()))...?

public class Downloader : IDownloader
{
    public Downloader(HttpClient httpClient, IFileSystem fileSystem) 
    {
        HttpClient = httpClient;
        FileSystem = fileSystem;
    }

    public async Task DownloadConfigFileAsync(string updatedConfigBaseFolderPath, string configurationFileUrl, string personalAccessToken)
    {
        var newFilePath = FileSystem.Path.Combine(updatedConfigBaseFolderPath, "subfolder1", "myNewFile.txt");
        if (FileSystem.File.Exists(newFilePath))
        {
            FileSystem.File.Delete(newFilePath);
        }

        // rest of implementation ommited for demo purpose
    }
}

And my test is like :

[Fact]
public async void Given_MissingPathParts_ShouldThrow()
{
    var handlerMock = GetMessageHandlerMock();
    var mockFileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
    {
        { @"c:\Test\", new MockDirectoryData() },
        { @"c:\Test\subfolder1\myNewFile.txt", new MockFileData(string.Empty) }
    });

    var httpClient = new HttpClient(handlerMock.Object);
    var sut = new Downloader(httpClient, mockFileSystem);

    await sut.DownloadConfigFileAsync(BasePath, "http://fakeurl.com?path=%2Fconfiguration%2Flocal%2FTestFile.txt", _fixture.Create<string>());

    handlerMock.Protected().Verify(
        "SendAsync",
        Times.Exactly(1),
        ItExpr.Is<HttpRequestMessage>(req => req.Method == HttpMethod.Get),
        ItExpr.IsAny<CancellationToken>());

    mockFileSystem.File.Exists(FilePath).Should().BeTrue();
    
   // Add assertion that the File.Delete has been called
}

来源:https://stackoverflow.com/questions/63742432/verify-call-to-file-delete-with-system-io-abstractions-testinghelpers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!