Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nunit 努尼特断言。等于我错过了什么?_Nunit - Fatal编程技术网

Nunit 努尼特断言。等于我错过了什么?

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); /

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 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);