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

如何将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.Json NuGet包
  • 如果使用.NET Framework,可替换System.Text.Json为Newtonsoft.Json,调整序列化/反序列化代码即可
  • 根据实际测试场景选择对应方案,核心是通过序列化将对象转换为字节数组,再让Mock Stream处理这些字节

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:32:25