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

将DTO类必填字段改为JsonRequired后单元测试报错问题

问题原因与解决方法

核心差异

  • [Required]:属于ASP.NET Core模型验证体系,仅在模型绑定阶段(比如接收请求后将Body绑定到DTO对象时)检查字段是否存在。
  • [JsonRequired]:属于Newtonsoft.Json的特性,在序列化/反序列化阶段强制要求字段必须存在,序列化时如果字段未赋值(或为类型默认值,比如int的0),会直接抛出异常。

你的测试代码里只给ID赋值,Name是int类型默认值0,执行JsonConvert.SerializeObject(data)时,因为Name标记了[JsonRequired],Newtonsoft.Json会判定该字段不符合必填要求,直接抛出异常导致调试中断。

解决办法

1. 补全必填字段值

修改测试代码,给Name赋值合法的有效值:

var data = new customerDto { ID = ValidID, Name = ValidName }; // ValidName为合法int值
byte[] byteArray = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data));
httpContext.Request.Body = new MemoryStream(byteArray);

2. 调整Json序列化配置(谨慎使用)

如果业务允许序列化时忽略[JsonRequired]的强制检查,可在序列化时指定配置:

var settings = new JsonSerializerSettings
{
    Required = Required.Default // 覆盖全局必填检查规则
};
byte[] byteArray = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data, settings));

注意:该配置会全局关闭Json.NET的必填字段验证,可能影响其他DTO的验证逻辑,需谨慎使用。

3. 明确特性使用场景

如果仅需要模型绑定阶段的必填验证,继续使用[Required]即可;如果需要序列化/反序列化时的严格字段检查,则必须确保测试代码中所有标记[JsonRequired]的字段都被正确赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:25:40