NUnit Assert.Equals我缺少什么?

ble*_*evo 10 nunit

Assert.Equals()从不调用

Equals()
operator ==
operator !=
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?我已经实现了IEquatable但是在使用nunit时仍然没有调用这些方法.

if (objectA != objectB) Assert.Fail(); //doesnt fail
if (!objectA.Equals(objectB)) Assert.Fail(); //doesnt fail
Assert.AreEqual(objectA, objectB); //fail
Run Code Online (Sandbox Code Playgroud)

UPDATE

我应该更清楚.

public class Entity 
{
  public int ID { get; set; }
}

var objectA = new Entity() { ID = 1 };
var objectB = new Entity() { ID = 1 };
Run Code Online (Sandbox Code Playgroud)

两者使用相同的ID我已经实现了所有的相关方法两个独立的情况下,使这项工作的==,!=和equals但NUnit的AreSame和AreEqual仍无法调用这些方法.

Rob*_*ert 8

使用Assert.AreEqual(a, b)值类型,Assert.AreSame(a, b)引用类型. http://www.nunit.org/index.php?p=identityAsserts&r=2.2.7


Tho*_*enz 5

你绝对是对的。今天早些时候,我一直在努力解决类似的问题,直到我找到您的帖子,现在我确信 NUnit IsEqualTo() 并不总是调用所提供的 Equals 覆盖。

我说始终如一,因为有时确实如此。事实上我有两节课。第二个是从第一个衍生出来的。当我在第一个实例上调用 Is.EqualTo() 时,NUnit 会调用 Equals 覆盖,而对于第二个实例则不会。

虽然这很奇怪,但我没有时间进一步调查到底发生了什么。

有类似问题或解决方案的人绝对应该发布它,因为这是一件非常烦人的事情,实际上让我怀疑我的测试的有效性。

与此同时,我创建了以下 Affirm 类,它肯定会调用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

Affirm.That(actualObject).IsEqualTo(expectedObject);
Run Code Online (Sandbox Code Playgroud)

Affirm.That(actualObject).IsNotEqualTo(expectedObject);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。