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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:48:14