在Nunit中,比较两个对象列表,使它们包含相同的类型

时间:2014-09-26 18:33:22

标签: nunit

我正在编写一个EFException转换器,我正在为它构建一个Rulset。我想验证构建器是否返回规则列表:

 [Test]
    public void Build_CreateListOfEntityRules()
    {
        //arrange
        var expected = new List<IEntityRule>
                            {
                                new AutomaticDataLossEntityRule(),
                                new CommitFailedEntityRule(),
                                new DbEntityValidationEntityRule(),
                                new DbUnexpectedValidationEntityRule(),
                                new DbUpdateConcurrencyEntityRule(),
                                new DbUpdateEntityRule(),
                                new EntityCommandCompliationEntityRule(),
                                new EntityCommandExecutionEntityRule(),
                                new EntityErrorEntityRule(),
                                new EntitySqlEntityRule(),
                                new InvalidOperation(),
                                new MigrationEntityRule(),
                                new MigrationsPendingEntityRule(),
                                new ModelValidationEntityRule(),
                                new ObjectNotFound(),
                                new PropertyConstraintEntityRule(),
                                new UnintentionalCodeFirstEntityRule(),
                                new UpdateEntityRule()
                            };

        //act
        var actual = sut.Build();

        //assert
        CollectionAssert.AreEquivalent(expected, actual);

    }

Collection.AreEquivilent,Collection.AreEqual和Collection.Contains都失败了;但是,当我手动查看列表的输出时,它们是相同的。

为什么NUnit没有认识到这一点?

1 个答案:

答案 0 :(得分:2)

如果测试失败并且你不会期望它,那么我猜你没有正确地为你的某些类实现Equals方法(可能没有),因为这是方法最终在断言对象集合时被调用。

如果在任何IEntityRule实现中未实现方法,则调用类Equals的{​​{1}}方法,而当比较对象不是同一实例时,返回object

总结一下 - 解决方案是为false类实现public bool Equals(AutomaticDataLossEntityRule other),对其他类同样实现。