如何模拟 ShareFileClient.Download() 方法?调用下载方法返回 null

时间:2021-01-10 13:48:11

标签: c# unit-testing mocking azure-storage

public void FileDownloadFromAzure(String fileWithPath)
{
    char separator = '\\';
    String localRootDir = "C:\\XYZ";
    String azureRootDir = "XYZ";
    String fileName = fileWithPath.Substring(fileWithPath.LastIndexOf(separator) + 1);
    String dirName = fileWithPath.Substring(0, fileWithPath.LastIndexOf(separator));
    String destDirWithFullPath = localRootDir + "\\" + dirName + "\\" + fileName;
    String sourceDirWithFullPath = azureRootDir + "\\" + dirName;
    try
    {
        ShareDirectoryClient directory = m_ShareClient.GetDirectoryClient(sourceDirWithFullPath);
        ShareFileClient file = directory.GetFileClient(fileName);

        // Download the file
        ShareFileDownloadInfo download = file.Download();//call returns null
        using (Stream stream = m_FileSystem.File.OpenWrite(destDirWithFullPath))
        {
            download.Content.CopyTo(stream);
        }
    }
    catch(Exception ex) {}
}

FileDownloadFromAzure 以上按预期工作。

我正在尝试为此编写单元测试。

[TestMethod]
public void FileDownloadFromAzure_ValidCall()
{
    //arrange
    var shareDirectoryClient = new Mock<ShareDirectoryClient>();
    var shareFileClient = new Mock<ShareFileClient>();
    var shareFileDownloadInfo = new Mock<Response<ShareFileDownloadInfo>>();
    shareFileClient.Setup(s => s.Download(It.IsAny<HttpRange>(), 
                                              false, null,
                                              It.IsAny<CancellationToken>()))
                                    .Returns(shareFileDownloadInfo.Object);
    shareDirectoryClient.Setup(s => s.GetFileClient(It.IsAny<String>())).Returns(shareFileClient.Object);
    _shareClient.Setup(s => s.GetDirectoryClient(It.IsAny<String>())).Returns(shareDirectoryClient.Object);

    var sut = new FileSystemIOProcessor(_shareClient.Object,
                                        _fileSystem.Object);
    //act
    String fileWithPath = "TEST\\TEST.TXT";
    var actual = sut.FileDownloadFromAzure(fileWithPath);

    //assert
    Assert.AreEqual(true, actual);
}

但我不熟悉使用模拟。您能否分享您对模拟 ShareFileClient.Download() 方法的看法?

1 个答案:

答案 0 :(得分:0)

<块引用>

块引用 我通过从以下帖子中获取线索解决了该问题。 Mocking File.OpenWrite()

String const TEMP_DIR_NAME = "TEMPDIR";
String const TEMP_FILE_NAME = "TEMPFILE.TXT";

[TestInitialize]
public void TestInitialize()
{
    //...Create temp dir and temp file as part of TestInitialize()
}

[TestMethod]
public void FileCopyFromAzureToLocal()
{
...
//Arrange
    String sourceDirWithFullPath = azureRootDir + "\\" + TEMP_DIR_NAME;
    ShareDirectoryClient directory = shareClient.GetDirectoryClient(sourceDirWithFullPath);
    ShareFileClient file = directory.GetFileClient(TEMP_FILE_NAME);
    shareFileDownloadInfo = file.Download();
    shareFileClient.Setup(s => s.Download(It.IsAny<HttpRange>(),
                                          false, null,
                                          It.IsAny<CancellationToken>()))
                                          .Returns(shareFileDownloadInfo);
...
//Act
//Assert    
}

[ClassCleanup]
public static void Class_Cleanup()
{
    //...
    DeleteDirectoryOnAzure(TEMP_DIR_NAME, recursive=true);
    //...
}
相关问题