在C#中,如何获得嵌套匿名数组和对象的递归值相等?

And*_*rew 7 c#

注意:对于Assert,使用Xunit

匿名对象使用值相等:

Assert.Equal(
  new { foo = "bar" },
  new { foo = "bar" }
);
Run Code Online (Sandbox Code Playgroud)

具有匿名对象的匿名数组使用值相等:

Assert.Equal(
  new [] { new { foo = "bar" } },
  new [] { new { foo = "bar" } }
);
Run Code Online (Sandbox Code Playgroud)

具有嵌套数组的匿名对象似乎使用引用相等(这会失败):

Assert.Equal(
  new { baz = new [] { new { foo = "bar" } },
  new { baz = new [] { new { foo = "bar" } }
);
Run Code Online (Sandbox Code Playgroud)

但这有效(大概是因为现在有参考相等):

var baz = new [] { new { foo = "bar" } };
Assert.Equal(
  new { baz },
  new { baz }
);
Run Code Online (Sandbox Code Playgroud)

这是有效的(所以看起来我可以递归地嵌套保持值相等的匿名对象):

Assert.Equal(
  new { baz = new { qux = new { foo = "bar" } } },
  new { baz = new { qux = new { foo = "bar" } } }
);
Run Code Online (Sandbox Code Playgroud)

我不确定这里是如何进行相等的,但我希望能够嵌套对象和数组并具有无限深度的值相等.我该怎么做呢?

更新

看起来像Fluent Assertions解决了我的问题(这个测试通过):

(new { baz = new[] { new { foo = "bar" } } })
    .Should()
    .BeEquivalentTo(new { baz = new [] { new { foo = "bar" } } });
Run Code Online (Sandbox Code Playgroud)

Ari*_*ion 2

我建议您使用FluentAssertions nuget 包。它可以让您按属性比较任何对象和集合,包括嵌套对象/集合,例如:

result.Should().BeEquivalentTo(expected);
Run Code Online (Sandbox Code Playgroud)

它还具有广泛的选项,允许您按运行时类型而不是编译时类型进行比较,或从比较中排除某些属性。

尊重运行时类型的示例应该适用于那些匿名对象:

result.Should().BeEquivalentTo(expected, options => 
    options.RespectingRuntimeTypes());
Run Code Online (Sandbox Code Playgroud)