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; });
额外优化建议
- 用
using语句包裹File.OpenRead的流,避免手动管理时出现资源泄漏; - 如果你的
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
相关产品推荐
相关产品推荐

