ASP.NET集成测试:WebApplicationFactory返回JSON解析后字段为空
问题原因分析
服务端返回的JSON采用驼峰命名({"name":"SomeName","someEnum":"No"}),这是ASP.NET Core中JsonOptions的默认行为(启用JsonNamingPolicy.CamelCase)。但你的测试代码中:
- 手动创建的
JsonSerializerOptions仅添加了JsonStringEnumConverter,但未配置驼峰命名策略,导致序列化器无法将JSON中的驼峰字段与SomeView类的帕斯卡命名属性(Name、SomeEnum)匹配。 - 字段不匹配时,字符串属性会被赋值为
null,枚举属性会使用默认值0,因此出现断言失败(预期No,实际0)。
解决方案
以下三种方案任选其一即可:
方案1:复用服务端配置好的JsonSerializerOptions
直接从测试工厂的服务容器中获取和服务端一致的序列化配置,避免手动配置不一致的问题:
[Fact] public async Task Test1() { var factory = new WebApplicationFactory<Program>(); var client = factory.CreateClient(); // 获取服务端配置的JsonOptions var jsonOptions = factory.Services.GetRequiredService<IOptions<JsonOptions>>().Value; var response = await client.GetAsync("/test"); var result = await response.Content.ReadFromJsonAsync<SomeView>(jsonOptions.SerializerOptions); Assert.Equal(SomeEnum.No, result.SomeEnum); }
方案2:手动配置完整的JsonSerializerOptions
如果需要手动创建配置,必须同时添加驼峰命名策略和枚举转换器:
[Fact] public async Task Test1() { var factory = new WebApplicationFactory<Program>(); var client = factory.CreateClient(); var response = await client.GetAsync("/test"); var result = await response.Content.ReadFromJsonAsync<SomeView>(new JsonSerializerOptions() { Converters = { new JsonStringEnumConverter() }, PropertyNamingPolicy = JsonNamingPolicy.CamelCase // 关键:匹配服务端的驼峰命名 }); Assert.Equal(SomeEnum.No, result.SomeEnum); }
方案3:通过特性指定属性与JSON字段的映射
在SomeView类的属性上添加JsonPropertyName特性,强制指定对应的JSON字段名:
public class SomeView { [JsonPropertyName("name")] public string Name { get; set; } [JsonPropertyName("someEnum")] public SomeEnum SomeEnum { get; set; } }
这种方式无需修改测试代码,但会将类与JSON字段名耦合在一起。
内容的提问来源于stack exchange,提问作者pklimczu
相关产品推荐
相关产品推荐

