You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure CloudFile DownloadToStream方法Mock回调失效问题排查

解决Moq回调参数不匹配的异常

你的问题出在Moq回调方法的参数数量和被Mock方法的参数不匹配上。

你Setup的DownloadToStream方法完整签名是:

void DownloadToStream(Stream target, AccessCondition accessCondition, FileRequestOptions options, OperationContext operationContext)

但你写的Callback只接收了一个Stream参数,Moq要求回调的参数列表必须和被Mock方法的参数完全对齐——不管你用不用后面的参数,都得在回调里声明出来,否则就会抛出参数不匹配的异常。

修正后的代码示例

你只需要把Callback的参数补全,用下划线(或者任意变量名)表示你不需要使用的参数即可:

var stream = new MemoryStream();
using var fileStream = File.OpenRead("file.txt"); // 建议用using自动释放流资源
fileStream.CopyTo(stream);
stream.Position = 0;

var cloudFile = new Mock<CloudFile>(fakeStorageUri, fakeStorageCredentials);
cloudFile.Setup(x => x.DownloadToStream(It.IsAny<Stream>(), It.IsAny<AccessCondition>(), It.IsAny<FileRequestOptions>(), It.IsAny<OperationContext>()))
    .Callback((Stream target, AccessCondition _, FileRequestOptions __, OperationContext ___) => {
        stream.CopyTo(target);
        target.Position = 0;
    });

额外优化建议

  1. 用using语句包裹File.OpenRead的流,避免手动管理时出现资源泄漏;
  2. 如果你的ProcessData方法只需要读取文本内容,也可以直接预加载测试数据到字符串,然后用StreamWriter写入目标流,简化测试逻辑:
var testData = File.ReadAllText("file.txt");
var cloudFile = new Mock<CloudFile>(fakeStorageUri, fakeStorageCredentials);
cloudFile.Setup(x => x.DownloadToStream(It.IsAny<Stream>(), It.IsAny<AccessCondition>(), It.IsAny<FileRequestOptions>(), It.IsAny<OperationContext>()))
    .Callback((Stream target) => {
        var writer = new StreamWriter(target);
        writer.Write(testData);
        writer.Flush();
        target.Position = 0;
    });

内容的提问来源于stack exchange,提问作者PSR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:47:35