NUnit Assert.Equals我缺少什么?

时间:2009-07-06 03:20:56

标签: 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); //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仍然无法调用这些方法。

5 个答案:

答案 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)代替。