Moq框架Mock方法时修改传入参数无效问题排查
问题原因
核心错误是C#参数传递的基础逻辑问题:Stream属于引用类型,但你在Returns和Callback委托里做的是给局部参数变量重新赋值的操作,而非修改调用方传入的原始流对象本身。这个赋值只会修改委托作用域内的outStream局部变量指向,完全不会影响调用方持有的原始Stream实例,自然拿不到你写入的内容。
不管用Returns还是Callback,只要写outStream = new MemoryStream(...)都不会生效,和Moq框架本身的配置没有关系。
正确写法
不要给参数重新赋值,直接向调用方传入的原始Stream实例写入目标内容即可:
MyMock .Setup(m => m.MyMethodAsync(It.IsAny<Stream>())) .Returns((Stream outStream) => { byte[] content = Encoding.UTF8.GetBytes("this is the content"); // 直接向传入的原始流写入数据 outStream.Write(content, 0, content.Length); // 写完后将流的读取位置重置到开头,避免调用方读取时直接到流末尾读不到内容 outStream.Position = 0; return Task.CompletedTask; });
Callback版本逻辑完全一致:
.Callback((MT365ReceiveResult result, Stream outStream) => { byte[] content = Encoding.UTF8.GetBytes("this is the content"); outStream.Write(content, 0, content.Length); outStream.Position = 0; });
特殊场景说明
如果你确实需要在方法执行时直接替换调用方持有的Stream引用,必须将方法对应参数加上ref或者out修饰符,但常规的流处理设计都是向传入的现有流实例写入内容,几乎不会设计成替换引用的形式,优先使用上述写入原始流的方案即可。
内容的提问来源于stack exchange,提问作者Marcel W.
相关产品推荐
相关产品推荐

