如何将WebHookBody对象类转换为Mock Stream?现有Mock代码遇阻
实现WebHookBody对象到Mock Stream的转换
以下分两种常见场景给出实现方案,基于Moq框架和System.Text.Json序列化库:
场景一:模拟写入流时接收WebHookBody对象
适用于测试「将WebHookBody序列化后写入Stream」的逻辑,Mock Stream会捕获写入的字节并反序列化为对象,用于验证。
using System.Text; using System.Text.Json; using Moq; // 1. 准备测试用的WebHookBody对象 var testBody = new WebHookBody { entryId = "test-entry-001" }; var wasCalled = false; WebHookBody receivedBody = null; // 2. 创建并配置Mock Stream var mockStream = new Mock<Stream>(); mockStream.Setup(s => s.CanWrite).Returns(true); mockStream.Setup(s => s.Write(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>())) .Callback((byte[] bytes, int offset, int count) => { wasCalled = true; // 截取写入的有效字节并反序列化为WebHookBody var validBytes = bytes.AsSpan(offset, count).ToArray(); receivedBody = JsonSerializer.Deserialize<WebHookBody>(validBytes); }); // 3. 模拟业务逻辑:将对象序列化后写入Mock Stream var serializedJson = JsonSerializer.Serialize(testBody); var jsonBytes = Encoding.UTF8.GetBytes(serializedJson); mockStream.Object.Write(jsonBytes, 0, jsonBytes.Length); // 4. 验证结果 // wasCalled 应为 true // receivedBody.entryId 应等于 testBody.entryId
场景二:模拟读取流时获取WebHookBody对象
适用于测试「从Stream读取数据并反序列化为WebHookBody」的逻辑,Mock Stream会返回预先序列化好的对象字节数据。
using System.Text; using System.Text.Json; using Moq; // 1. 准备测试用的WebHookBody对象并序列化 var testBody = new WebHookBody { entryId = "test-entry-001" }; var serializedBytes = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(testBody)); var currentPosition = 0; // 2. 创建并配置Mock Stream var mockStream = new Mock<Stream>(); mockStream.Setup(s => s.CanRead).Returns(true); mockStream.Setup(s => s.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>())) .Callback((byte[] buffer, int offset, int count) => { // 将预先生成的字节数据复制到读取缓冲区 var bytesToCopy = Math.Min(count, serializedBytes.Length - currentPosition); Array.Copy(serializedBytes, currentPosition, buffer, offset, bytesToCopy); currentPosition += bytesToCopy; }) .Returns((byte[] buffer, int offset, int count) => { // 返回实际读取的字节数 var bytesToReturn = Math.Min(count, serializedBytes.Length - currentPosition); currentPosition += bytesToReturn; return bytesToReturn; }); // 3. 模拟业务逻辑:从Mock Stream读取并反序列化 using var streamReader = new StreamReader(mockStream.Object); var readJson = streamReader.ReadToEnd(); var receivedBody = JsonSerializer.Deserialize<WebHookBody>(readJson); // 4. 验证结果 // receivedBody.entryId 应等于 testBody.entryId
注意事项
- 确保项目已安装
Moq和System.Text.JsonNuGet包 - 如果使用.NET Framework,可替换
System.Text.Json为Newtonsoft.Json,调整序列化/反序列化代码即可 - 根据实际测试场景选择对应方案,核心是通过序列化将对象转换为字节数组,再让Mock Stream处理这些字节
内容的提问来源于stack exchange,提问作者Harikarthik
相关产品推荐
相关产品推荐

