我正在编写一个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没有认识到这一点?
答案 0 :(得分:2)
如果测试失败并且你不会期望它,那么我猜你没有正确地为你的某些类实现Equals
方法(可能没有),因为这是方法最终在断言对象集合时被调用。
如果在任何IEntityRule
实现中未实现方法,则调用类Equals
的{{1}}方法,而当比较对象不是同一实例时,返回object
。
总结一下 - 解决方案是为false
类实现public bool Equals(AutomaticDataLossEntityRule other)
,对其他类同样实现。