如何测试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
相关产品推荐
相关产品推荐

