FluentAssertions 对象图比较,包括 JSON 对象

Posted

技术标签:

【中文标题】FluentAssertions 对象图比较,包括 JSON 对象【英文标题】:FluentAssertions object graph comparison including JSON objects 【发布时间】:2021-01-11 10:34:59 【问题描述】:

我有一个简单的类,它有一个对象类型的属性,它可以包含从不同来源构建的 JSON

public class SimpleClass

    public string Id  get; set; 
    public object JSONData  get; set; 

我正在使用 FluentAssertions 对象图比较,但这不起作用

private void Verify(SimpleClass actualOutput, SimpleClass expectedOutput)

    actualOutput.Should().BeEquivalentTo(expectedOutput);

根据对象的来源,我看到类似这样的消息

Expected member JSONData to be a 
System.Collections.Generic.IDictionary`2[System.String,Newtonsoft.Json.Linq.JToken], but found a 
System.Text.Json.JsonElement.

Expected member JSONData to be 
System.String, but found 
System.Text.Json.JsonElement.

当我将它们转换为字符串时,对象是相等的

private void Verify(SimpleClass actualOutput, SimpleClass expectedOutput)

    actualOutput.JSONData.ToString().Should().Be(expectedOutput.JSONData.ToString());

我不想像那样比较单个属性,因为我需要比较 SimpleClass 实例的集合。有没有办法使用对象图比较来完成这项工作?我可以配置 FluentAssertions 在比较期间进行字符串转换吗?

【问题讨论】:

你试过什么?什么不起作用? 您的序列化程序不匹配。 Newtonsoft.JsonSystem.Text.Json。无论如何,要正确处理这种情况,请将所有 JSON 反序列化为强类型值并比较结果 【参考方案1】:
[Fact]
public void CompareJson()

    var jsonText = @"
  ""Element1"": 123,
  ""Element2"": ""text""
";
    var x1 = new SimpleClass  Id = "X", JSONData = jsonText ;
    var x2 = new SimpleClass  Id = "X", JSONData = JsonConvert.DeserializeObject(x1.JSONData.ToString()) ;

    x1.Should().BeEquivalentTo(
        x2,
        o => o.Using<object>(ctx => ctx.Subject.ToString().Should().Be(ctx.Expectation.ToString())).When(
            info => info.SelectedMemberPath.EndsWith(nameof(SimpleClass.JSONData))));

【讨论】:

以上是关于FluentAssertions 对象图比较,包括 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

.Net FluentAssertions .Contains 不能正确比较对象

FluentAssertions - 比较包含名称相似但类型不同的属性的对象

如果一个属性可以为空,则比较对象时 FluentAssertions 失败

如何比较通过 ID 链接的对象图?

FluentAssertions 比较列表的内容而不是列表本身

使用 FluentAssertions 比较包含不同类型的两个字典集合