c# - 创建一个 IEqualityComparer<IEnumerable<T>>

标签 c# .net unit-testing xunit xunit.net

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

我试过使用 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
    }
}

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

如果您能帮助我进行系列比较,我将不胜感激!

最佳答案

我刚刚验证了这适用于 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());
    }
}

所以我不是 100% 清楚为什么您需要额外的比较器。只需一个比较器就足够了。

关于c# - 创建一个 IEqualityComparer<IEnumerable<T>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18720582/

相关文章:

c# - 设计附加基础应用程序

unit-testing - 如何更改angular2单元测试中选择框的值?

c# - 我可以在模拟中处理不区分大小写的字符串吗?

c# - 代码实体引用 SandcaSTLe developerHowToDocument 上的方法

C# keyup 事件问题

c# - 如何结合 "IF"条件使用技巧?(C# ASP.NET)

javascript - 如何在 JavaScript 中对回调逻辑进行单元测试?

c# - 如何在不下载所有页面源的情况下始终获取网站标题

c# - 方法可以静态化,但应该吗?

c# - 如何在 IQueryable 对象的 LINQ 查询的 where 子句中调用方法