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

如何测试Contentful .NET SDK中GetEntries调用的反序列化?

模拟Contentful API响应验证反序列化逻辑

完全可以通过模拟API响应来编写单元测试,验证反序列化步骤的稳定性,这里给你几个可行的方案:

1. 直接调用SDK的反序列化工具类

Contentful的.NET SDK内部封装了适配API响应格式的序列化逻辑,你可以直接用它来测试,不用走完整的API请求流程:

  • 先根据你的内容模型构造符合Contentful响应格式的JSON字符串(参考API实际返回结构,或从Contentful后台导出示例条目)
  • 初始化SDK自带的ContentfulJsonSerializer,用它创建的JsonSerializerOptions来反序列化JSON
  • 捕获并验证是否有JsonException抛出,同时检查字段值是否正确映射

示例代码:

using Contentful.Core.Serialization;
using System.Text.Json;

// 构造匹配你内容模型的Contentful条目JSON
var testEntryJson = @"
{
  ""sys"": {
    ""id"": ""demo-entry"",
    ""type"": ""Entry"",
    ""contentType"": { ""sys"": { ""id"": ""your-content-type"" } }
  },
  ""fields"": {
    ""requiredTitle"": ""测试标题"",
    ""optionalBody"": null,
    ""requiredCount"": 100
  }
}";

// 使用SDK的序列化配置
var serializer = new ContentfulJsonSerializer();
var jsonOptions = serializer.CreateJsonSerializerOptions();

try
{
    var entry = JsonSerializer.Deserialize<YourContentModel>(testEntryJson, jsonOptions);
    
    // 验证字段映射是否正确
    Assert.Equal("测试标题", entry.Fields.RequiredTitle);
    Assert.Null(entry.Fields.OptionalBody);
    Assert.Equal(100, entry.Fields.RequiredCount);
}
catch (JsonException ex)
{
    Assert.Fail($"反序列化失败:{ex.Message}");
}

2. 模拟HTTP请求流程(贴近真实调用)

如果想测试完整的GetEntry/GetEntries调用链,可以用Moq这类工具模拟HttpClient,让SDK收到你构造的响应:

  • 构造包含目标JSON的HttpResponseMessage
  • 模拟HttpMessageHandler的SendAsync方法,返回自定义响应
  • 用模拟的HttpClient初始化ContentfulClient,调用目标方法验证结果

示例代码:

using Moq;
using Moq.Protected;
using Contentful.Core;
using System.Net;

// 构造多条目的响应JSON
var entriesResponseJson = @"
{
  ""items"": [
    {
      ""sys"": { ""id"": ""entry-001"", ""type"": ""Entry"" },
      ""fields"": { ""title"": ""第一条目"" }
    },
    {
      ""sys"": { ""id"": ""entry-002"", ""type"": ""Entry"" },
      ""fields"": { ""title"": ""第二条目"" }
    }
  ]
}";

// 模拟HttpMessageHandler
var handlerMock = new Mock<HttpMessageHandler>();
handlerMock.Protected()
    .Setup<Task<HttpResponseMessage>>(
        "SendAsync",
        ItExpr.IsAny<HttpRequestMessage>(),
        ItExpr.IsAny<CancellationToken>()
    )
    .ReturnsAsync(new HttpResponseMessage
    {
        StatusCode = HttpStatusCode.OK,
        Content = new StringContent(entriesResponseJson, System.Text.Encoding.UTF8, "application/json")
    });

// 创建客户端并调用方法
var httpClient = new HttpClient(handlerMock.Object);
var contentfulClient = new ContentfulClient(httpClient, "dummy-space-id", "dummy-token");

var result = await contentfulClient.GetEntries<YourContentModel>();

// 验证结果
Assert.Equal(2, result.Items.Count);
Assert.Equal("第一条目", result.Items[0].Fields.Title);

3. 重点测试场景

针对你之前遇到的nullable引用类型问题,一定要覆盖这些场景:

  • 可选字段为null的响应
  • 缺少某些可选字段的响应
  • 必填字段存在/缺失的情况(后者应抛出异常,验证SDK错误处理)
  • 复杂字段类型(比如Contentful的引用、媒体资产、数组等)的反序列化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:04:58