我建议不要使用反射或任何复杂的东西,这只会增加更多的工作/维护。
序列化对象(我推荐使用json)并进行字符串比较。我不确定你为什么反对按顺序排序,但我仍然建议这样做,因为它将为每种类型保存自定义比较。
而且它可以自动适应领域对象的更改。
示例(SharpTestsEx用于流畅)
using Newtonsoft.Json;
using SharpTestsEx;
JsonConvert.SerializeObject(actual).Should().Be.EqualTo(JsonConvert.SerializeObject(expected));
你可以将其编写成简单的扩展程序,并使其更易于阅读。
public static class CollectionAssertExtensions
{
public static void CollectionAreEqual<T>(this IEnumerable<T> actual, IEnumerable<T> expected)
{
JsonConvert.SerializeObject(actual).Should().Be.EqualTo(JsonConvert.SerializeObject(expected));
}
}
然后使用您的示例进行调用,类似这样:
var foundCollection = fooManager.LoadFoo();
var expectedCollection = new List<Foo>()
{
new Foo() { Bar = "a", Bar2 = "b" },
new Foo() { Bar = "c", Bar2 = "d" }
};
foundCollection.CollectionAreEqual(foundCollection);
You'll get an assert message like so:
你将收到以下的断言信息:
...:"a","Bar2":"b"},{"Bar":"d","Bar2":"d"}]
...:"a","Bar2":"b"},{"Bar":"c","Bar2":"d"}]
..._______________^_____