将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
相关产品推荐
相关产品推荐

