Nunit 努尼特断言。等于我错过了什么?
Assert.Equals()从不调用Nunit 努尼特断言。等于我错过了什么?,nunit,Nunit,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); /
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 Areame和AreEqual仍然无法调用这些方法。对于值类型使用
Assert.AreEqual(a,b)
,对于引用类型使用Assert.Areame(a,b)
某些框架允许在分配Id之前(即,实体未保存)与在事后(当其明确意图是实体Id是质量的唯一基础时)平等的工作方式不同。您是在使用某种框架,还是实体是您自己的类
如果是你自己的类,你能展示一下Equals()逻辑的要点吗
干杯,
贝里尔
仅供参考Assert.AreName从来不是验证IEquatable实现的测试!请参阅帮助文档中的ReferenceEquals,以便更好地理解该断言。如果Equals方法被正确重写,它应该可以工作(请参见此)。您的Equals方法会有问题吗(尽管如果它只是包含int比较,我认为不会)?可能值得在Equals方法中设置一个断点,然后运行测试,看看幕后发生了什么。您肯定是正确的。 今天早些时候,我一直在与一个函数进行斗争,直到我找到了你的帖子,现在我确信NUnit IsEqualTo()不会一直调用提供的Equals覆盖 我总是这样说,因为有时候的确如此。事实上,我有两门课。第二个源于第一个。当我对第一个实例调用Is.EqualTo()时,NUnit会调用Equals重写,而对第二个实例则不会 虽然这很奇怪,但我没有时间进一步调查到底发生了什么 有类似问题或解决方案的人一定要发布,因为这是一件非常烦人的事情,实际上让我怀疑我的测试的有效性 同时,我创建了下面的确认类,它确实调用了Equals重写(我检查了它)。它使用NUnit来执行简单的相等断言,而不是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);
}
}
及
希望这能有所帮助。您可能想查看以下问题: tl;博士
Assert.Equals(obj1,obj2)
被NUnit重写,并引发异常。您应该改用Assert.AreEqual(obj1,obj2)
。这仍然表明,由于某些原因,它们并不相同。。(它不会调用我的equal方法):(我试图测试的是同一个类的两个实例,它们具有相同的ID,应该说是相等的。不确定,您当然可以执行Assert.IsTrue(objectA==objectB),但我不确定为什么需要。Assert.arame(a,b)
实际上正在执行ReferenceEquals(a,b)
,可能不是您想要的。如果您想要断言相同的对象实例,请使用此方法。否则,您最好使用断言.AreEqual(a,b)
。我有完全相同的问题。目前我使用的是assert.IsTrue(objectA.Equals(objectB));我也有同样的问题,我已经确定,如果我正在比较的对象不是相同的引用,那么它是有效的。即创建两个具有不同属性的对象,除了相等比较属性之外,然后断言。相等有效…如果它与相同的引用进行比较(肯定相等),那么它失败!因为不相等(NUnit 2.5)您正在寻找Assert.AreEqual(objA,objB);
只是为了完整性:正如您在原始帖子()中所看到的,您的问题是由您重写object.Equals(object)时的错误引起的。(我猜这个线程的OP问题是由类似的错误引起的。)@FabianSchmied我不认为这是由于equals方法中的错误,因为他说Nunit甚至从来没有调用过他的equals方法。我来到这里时遇到了同样的问题。如果equals方法没有被NunitI调用,我在equals方法中做了什么改变都无关紧要。我也有同样的问题,但在我自己在类上实现equals之前,我的测试工作正常。一定有什么东西说服了NUnit,既然我有了Equals方法,就不要调用我的Equals方法。我不认为我准备研究代码,因为我可以使用Assert.IsTrue(obj1.Equals(obj2))使它工作@PandaWood Thorsten Lorenz的示例有两个Equals
方法:一个采用object
类型的参数,一个采用基类类型的参数。NUnit称之为object
类型的方法。该方法有一个缺陷:它包含一个类型检查,而不考虑子类。解决方案是修复该类型检查。请参阅“.1”中的“Assert.arame永远不是验证IEquatable实现的测试”
Affirm.That(actualObject).IsEqualTo(expectedObject);
Affirm.That(actualObject).IsNotEqualTo(expectedObject);