创建IEqualityComparer <IEnumerable <T >>

Jon*_*Jon 2 .net c# unit-testing xunit xunit.net

我正在使用xUnit,IEnumerable<T>如果T是自定义类型,它无法确定2 是否相等.

我已尝试使用LINQ SequenceEqual但是再次因为T不同的实例返回false;

这是一个非工作的基本测试 IEqualityComparer

    [Fact]
    public void FactMethodName()
    {
        var one = new[] { new KeywordSchedule() { Id = 1 } };
        var two = new[] { new KeywordSchedule() { Id = 1 } };

        Assert.Equal(one, two, new KeywordScheduleComparer());
    }

public class KeywordScheduleComparer : IEqualityComparer<IEnumerable<KeywordSchedule>>
{
    public bool Equals(IEnumerable<KeywordSchedule> x, IEnumerable<KeywordSchedule> y)
    {
        return Object.ReferenceEquals(x, y) || (x != null && y != null && x.SequenceEqual(y));
    }

    public int GetHashCode(IEnumerable<KeywordSchedule> obj)
    {
        if (obj == null)
            return 0;

        return unchecked(obj.Select(e => e.GetHashCode()).Aggregate(0, (a, b) => a + b));  // BAD
    }
}
Run Code Online (Sandbox Code Playgroud)

我在集成测试中使用它,所以我在开始时将数据从IEnumerable插入到数据库中,然后调用我的SUT从DB中检索数据并进行比较.

如果你能帮助我进行收藏比较工作,我会很感激!

Bra*_*son 8

我刚刚验证了xUnit.net 1.9.2可以正常工作:

public class MyClass
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class MyClassComparer : IEqualityComparer<MyClass>
{
    public bool Equals(MyClass x, MyClass y)
    {
        return x.ID == y.ID;
    }

    public int GetHashCode(MyClass obj)
    {
        return obj.ID.GetHashCode();
    }
}

public class ExampleTest
{
    [Fact]
    public void TestForEquality()
    {
        var obj1 = new MyClass { ID = 42, Name = "Brad" };
        var obj2 = new MyClass { ID = 42, Name = "Joe" };

        Assert.Equal(new[] { obj1 }, new[] { obj2 }, new MyClassComparer());
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我不是100%清楚为什么你需要额外的比较器.只需单个比较器即可.