注意:对于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)
我建议您使用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)