跳过xUnit中集合相等性的类型检查

时间:2018-10-12 10:26:41

标签: c# .net collections xunit xunit.net

具有微不足道的继承

private class TestBase : IEquatable<TestBase> {
    public string Name { get; set; } = "test1";

    public bool Equals(TestBase other) => this.Name == other.Name;
}

private class Test : TestBase {}

我需要比较两个集合:

var s1 = new TestBase();
var s2 = new Test();
Assert.Equal(s1, s2); // OK, uses IEquatable
Assert.StrictEqual(s1, s2); // OK uses IEquatable
Assert.Equal(new[] { s1 }, new[] { s2 }); // fails
Assert.Equal<IEnumerable<TestBase>>(new[] { s1 }, new[] { s2 }); // fails
Assert.Equal(new TestBase[] { s1 }, new TestBase[] { s2 }); // fails

对我来说,如果单个实例的Assert.Equal()使用IEquatable接口,则集合重载也应该使用该接口,并且不要比较类型。如何获得想要的行为?

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用Fluent断言进行比较?

我想到的是

x = new[] {s1};
y = new[] {s2};
x.Should().BeEquivalentTo(y, o => o.Excluding(p => p.Type));

表示两个对象集合彼此等效,但忽略类型。我还没有尝试使用类型的Exclusion()部分,但是它适用于单个对象属性,因此也许也尝试使其适用于您的示例。

有关流利断言的其他信息:https://fluentassertions.com/about/