.NET Core快照单元测试:Verify无法正常序列化Newtonsoft.Json JObject
如何让Verify正确序列化Newtonsoft.Json JObject?
我使用Verify(版本19.6.0)编写快照单元测试测试复杂对象时,Newtonsoft.Json JObject属性被序列化为空数组,需要解决这个序列化问题。
相关代码
- 生产项目代码:
public class TestController : ControllerBase { public async Task<ActionResult> ReturnStubResult() { return Ok( new { Property1 = "value1", Property2 = 5, Property3 = new JObject() { ["ChildProperty1"] = "child value 1", ["ChildProperty2"] = 2 } }); } }
- 单元测试项目(引用Verify.Xunit库)代码:
[Fact] public async Task TestSnapshotSerialization() { var controller = new TestController(); var actionResult = await controller.ReturnStubResult(); var okObjectResult = actionResult.Should().BeOfType<OkObjectResult>().Which; await Verifier.Verify(okObjectResult.Value); }
当前错误的序列化输出
{ "Property1": "value1", "Property2": 5, "Property3": { "ChildProperty1": [], "ChildProperty2": [] } }
解决方案
Verify默认采用System.Text.Json序列化,而JObject是Newtonsoft.Json专属类型,System.Text.Json无法正确解析其内部结构,导致序列化异常。按以下步骤解决:
安装Verify.NewtonsoftJson扩展包
在单元测试项目中安装NuGet包Verify.NewtonsoftJson,该扩展用于让Verify兼容Newtonsoft.Json的各类类型。配置Verify使用NewtonsoftJson序列化
两种配置方式可选:- 全局配置(在测试项目启动时设置,例如
AssemblyInfo.cs或专用启动类):[ModuleInitializer] public static void Initialize() { VerifyNewtonsoftJson.Initialize(); } - 单测试配置(仅对当前测试生效):
修改测试代码,在Verify调用前添加UseNewtonsoftJson():await Verifier.Verify(okObjectResult.Value) .UseNewtonsoftJson();
- 全局配置(在测试项目启动时设置,例如
验证正确结果
重新运行测试,JObject会被正确序列化:{ "Property1": "value1", "Property2": 5, "Property3": { "ChildProperty1": "child value 1", "ChildProperty2": 2 } }
内容的提问来源于stack exchange,提问作者Mykola
相关产品推荐
相关产品推荐

