在单元测试中比较C#中System.Text.JsonDocument的内容。

3

我感觉自己像是疯了...但我如何比较两个JsonDocument(或JsonElement或其他类似的类型)的JSON相等性,即相同的键和相同的值?

为了限定范围,能够在单元测试中执行此比较就已足够。

我有一个单元测试,我想将返回JsonDocument的函数的结果与某些预期值进行比较。不起作用的方法包括使用FluentAssertions.Json(因为我的类型不是JObject),以及比较GetRawText的值,因为我不关心空格。

我想我可以将字符串写出并重新序列化它们之类的事情,但是这实在感觉像是一个hack,我一定做错了什么。

我理解比较它们的业务逻辑,我看过其他问题,例如这个这个。第一个更符合我的需求,这只是C#尴尬的结果...第二个根本不是我需要的。


1
相关:https://github.com/fluentassertions/fluentassertions/issues/1212 - Christoph Lütjen
1
非常不清楚你在问什么 - 显然你不是在寻找库(离题),你声称基本相同的“深度相等”问题绝对不是你要找的... 请[编辑]问题以澄清你希望看到的答案。 - Alexei Levenkov
@ChristophLütjen 谢谢,这看起来非常有前途,我很感激。 - Ben
没试过,不过你可以在JsonDocument上使用GetHash(),然后比较哈希值。 - Jonathan
@ChristophLütjen,您的链接问题完美地解决了这个问题。如果您愿意按照StackOverflow的风格写出来,我可以接受它。 - Ben
显示剩余2条评论
3个回答

1

感谢 @ChristophLütjen 在 这个问题 中提供了我需要的修复方法。

如果给定两个 JsonDocument,我可以像这样使用 FluentAssertions 进行比较:

Doc1.RootElement.Should().BeEquivalentTo(Doc2.RootElement, opt => opt.ComparingByMembers<JsonElement>());

我仍然感到困惑的是,针对一般情况下没有更直接的比较方法,但由于我目前使用的是单元测试,所以我对此结果感到满意。


4
那对我没用。当测试错误值以确保测试失败时,我的测试并没有失败。 - McFrank
不要使用这个!它总是返回true。你可以自己试试在非相等的文件上。 - Rast

0
.NET 8有一个新的static bool DeepEquals(JsonNode, JsonNode)方法,如果你只是想要一个简单的真/假回应。不幸的是,你不会得到关于这两个节点不相等的详细信息。
我可能会先将文档序列化(带有多行缩进),然后进行字符串比较。这样做的好处是,使用像流畅断言这样的断言库,你会得到一个漂亮的错误消息,比如说 "{...}不等于{...}:第一个差异在第X行,第Y个字符"。
对于更具体的情况,你可能需要指定选项。键的顺序是否重要?字符串中以不同方式表示的特殊字符怎么办?如果一个数组包含等效的对象,但位置不同,它还算相等吗?这并不像看起来那么简单。

0
Json.More有一个非常好用的IsEquivalentTo方法,可以用来比较System.Text.Json的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接