【问题标题】:xUnit Equal two same collections, same order, same types, returns falsexUnit Equal 两个相同的集合,相同的顺序,相同的类型,返回 false
【发布时间】:2019-03-07 13:59:32
【问题描述】:

如果两个集合相等,xUnit Equal 方法不应该返回 true,这意味着相同的对象具有相同的顺序吗?

例子:

var result = new List<item>()
            {
                new item()
                {
                    TypeId = typesEnum.Integer,
                    Code = "code"
                },
                new item()
                {
                   TypeId = typesEnum.Integer,
                   Code = "code2"
                }
            }

并且 Assert.Equal(expectedResult, result) 返回 false。

我在expectedResult中有完全相同的列表,一一检查,每个属性,类型,一切。当我编写自己的 IEqualityComparer 并比较其中项目类的每个属性时,结果为真。但默认比较器返回 false。这就是它应该为 xUnit 工作的方式吗?如果是这样,问题是如何比较两个集合是否相等?

自定义比较器如下所示:

internal class ItemComparer : IEqualityComparer<Item>
{
    public bool Equals(Item x, Item y)
    {
        return x.Code.Equals(y.Code) && x.TypeId.Equals(y.TypeId)
    }

    public int GetHashCode(Item obj)
    {
        return obj.GetHashCode();
    }
}

这是一个类似问题的链接: CLICK

答案是它应该像我认为的那样工作,而无需编写我自己的比较器。问题是为什么不呢?

我使用 xUnit 2.4.1

【问题讨论】:

  • "但默认比较器返回 false。"是的,如果您没有在item 中覆盖Equals 和GetHashCode,那么两个不同的对象是不相等的,即使它们具有相同的属性。您不需要编写自己的比较器,但您需要确保相等的对象按照您的意愿报告相等性。
  • 那个自定义比较器有问题,顺便说一句。由于平等是通过CodeTypeId 而不是GetHashCode 它不可能为cmp.Equals(x, y) 返回true 但对于cmp.GetHashCode(x) == cmp.GetHashCode(y) 则返回false。
  • 你是什么意思我不必使用自定义比较器但确保相等的对象报告我想要的相等?这本身不是制作自定义比较器吗?说到比较器,这只是一个简单的例子。

标签: c# xunit


【解决方案1】:

这不是 XUnit 问题或特殊性,而是 C# 的工作原理。当您有两个非原始对象且内部具有相同的值时,它们是等效的但不等于 - 在内部它们对每个属性都有不同的内存引用。您甚至可以尝试在 if 语句中使用 ==.Equals() 来比较两者,它会返回 false。

This answer explains very well about this subject

你能做什么:

  • 覆盖比较运算符并使用Assert.True(),并比较它们以返回true;

  • 使用提供等价比较的库,例如 FluentAssertion: object1.Should().BeEquivalentTo(object2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多