2009-07-06 82 views
10

Assert.Equals()永远不会调用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 

UPDATE

我本来应该更清晰。两者使用相同的ID我已经实现了所有的相关方法

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

var objectA = new Entity() { ID = 1 }; 
var objectB = new Entity() { ID = 1 }; 

两个独立的情况下,使这项工作的==,!=和equals但NUnit的AreSame和AreEqual仍无法调用这些方法。

+1

我有完全相同的问题。现在我正在使用 Assert.IsTrue(objectA.Equals(objectB)); – 2010-02-04 11:08:33

+0

我有同样的问题,我已经确定它的作品,如果我比较的对象是*不是*相同的参考。即创建2个具有不同属性的属性,然后Assert.Equals工作...如果它被相同的引用进行比较(肯定是相等的),那么它会失败! (NUnit 2.5) – PandaWood 2016-07-28 08:02:49

+0

您正在寻找`Assert.AreEqual(objA,objB);` – DanielV 2016-08-03 07:23:36

回答

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

希望这有助于。

8

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

+0

这还是说他们是不一样的,因为某些原因..(它不会调用我的平等方法):( 我试图测试的是同一个ID的2个实例,应该说他们是相同的。 – bleevo 2009-07-06 03:41:31

+0

不确定,你当然可以做Assert.IsTrue(objectA == objectB),但我不知道为什么你需要 – Robert 2009-07-06 03:46:24

3

某些框架允许在Id被分配(即实体未保存)之前以相同的方式工作,而不是在事后清楚地表明意图是实体Id是质量的唯一基础。你在使用某种框架还是Entity是你自己的类?

如果这是你自己的类,你可以展示你的equals()逻辑的要点?

干杯, Berryl

FYI Assert.AreSame从来都不是一个测试,以验证您的IEquatable的执行!请参阅帮助文档中的ReferenceEquals以更好地理解该断言。

1

它应该工作(见本related question)如果Equals方法正确覆盖。这可能是你的Equals方法的问题(尽管如果它只是由int比较组成,我不认为)?可能值得在Equals方法中设置一个中断点,然后运行测试以查看幕后发生了什么。