Assert.Equals()从不调用
Equals()
operator ==
operator !=
我错过了什么吗?我已经实现了IEquatable但是在使用nunit时仍然没有调用这些方法。
if (objectA != objectB) Assert.Fail(); //doesnt fail
if (!objectA.Equals(objectB)) Assert.Fail(); //doesnt fail
Assert.AreEqual(objectA, objectB); //fail
更新
我应该更清楚。
public class Entity
{
public int ID { get; set; }
}
var objectA = new Entity() { ID = 1 };
var objectB = new Entity() { ID = 1 };
两个具有相同ID的单独实例我已经实现了所有相关方法,使得这个工作适用于==,!=和Equals但是nunit AreSame和AreEqual仍然无法调用这些方法。
答案 0 :(得分:8)
将值Assert.AreEqual(a, b)
用于值类型,Assert.AreSame(a, b)
用于参考类型。 http://www.nunit.org/index.php?p=identityAsserts&r=2.2.7
答案 1 :(得分:4)
你绝对是对的。 我今天早些时候正在和similar problem进行摔跤,直到找到你的帖子并且我现在确定,NUnit IsEqualTo()并没有始终如一地调用提供的Equals覆盖。
我一贯地说,因为有时它确实如此。事实上我有两节课。第二个来自第一个。当我在第一个实例上调用Is.EqualTo()时,NUnit调用Equals覆盖,对于第二个实例则不调用。
虽然这非常特殊,但我没有时间进一步调查发生的事情。
有类似问题或解决方案的人应该发布它,因为这是一件非常讨厌的事情,实际上让我怀疑我的测试的有效性。
与此同时,我创建了以下Affirm类,它确实调用了Equals覆盖(我检查了它)。它使用NUnit来做一个简单的相等Assert而不是Is.EqualTo(),并且在一定程度上弥补了这一事实,这样NUnit在测试失败的情况下不会给出对象的字符串表示。
所以这是:
using NUnit.Framework;
public static class Affirm
{
public static Affirmer That(object actual)
{
return new Affirmer(actual);
}
}
[EditorBrowsable(EditorBrowsableState.Never)]
public class Affirmer
{
readonly object _actual;
public Affirmer(object actual)
{
_actual = actual;
}
public void IsEqualTo(object expected)
{
string failureMessage = string.Format("\nExpected: <{0}>\nBut was: <{1}>", _actual, expected);
Assert.That(_actual.Equals(expected), Is.True, failureMessage);
}
public void IsNotEqualTo(object expected)
{
string failureMessage = string.Format("\nDid not excpect: <{0}>\nBut was: <{1}>", _actual, expected);
Assert.That(_actual.Equals(expected), Is.False, failureMessage);
}
}
像这样使用:
Affirm.That(actualObject).IsEqualTo(expectedObject);
和
Affirm.That(actualObject).IsNotEqualTo(expectedObject);
希望这有帮助。
答案 2 :(得分:3)
有些框架允许在分配Id(即,实体未保存)之前以不同于Afterwarsd的方式进行不同的工作,当明确意图是实体ID是质量的唯一基础时。您使用某种框架还是实体是您自己的类?
如果是你自己的课你可以展示你的Equals()逻辑的要点吗?
干杯, Berryl
FYI Assert.AreSame绝不是验证IEquatable实现的测试!请参阅帮助文档中的ReferenceEquals以更好地理解断言。
答案 3 :(得分:1)
如果正确覆盖了Equals方法,它应该可以工作(请参阅此related question)。这可能是你的Equals方法的一个问题(虽然它只是由int比较我认为不会)?可能值得在Equals方法中设置一个断点,然后运行测试以查看幕后发生的事情。
答案 4 :(得分:1)
您可能想看看这个问题: NUnit's Assert.Equals throws exception "Assert.Equals should not be used for assertions"
TL;博士;
NUnit会覆盖Assert.Equals(obj1, obj2)
,并抛出异常。您应该使用Assert.AreEqual(obj1, obj2)
代替。