繁体   English   中英

Nunit:检查两个对象是否相同

[英]Nunit: Check that two objects are the same

我有一个对象

 public class Foo
            {
                public string A{ get; set; }
                public string B{ get; set; }
            }

我正在比较SUT的返回值,当它为A和B返回null时,就像这样。

Assert.That(returnValue, Is.EqualTo(new Foo { A = null, B = null}));

这没用,所以我试过了

Assert.That(returnValue, Is.SameAs(new Foo { A = null, B = null}));

这也不起作用。

我得到一条消息

 Expected: same as <Namespace+Foo>
 But was:  <Namespace+Foo>

我究竟做错了什么?

nunit文档

在检查用户定义的类的相等性时,NUnit在预期的对象上使用Equals覆盖。 如果忽略覆盖Equals,则可能会出现非相同对象的故障。 特别是,重写operator ==而不覆盖Equals没有任何效果。

但是,您可以提供自己的比较器来测试属性的值是否相等。

如果测试相等性的默认NUnit或.NET行为无法满足您的需求,则可以通过“使用”修饰符提供自己的比较器。 当与EqualConstraint一起使用时,您可以提供IEqualityComparer,IEqualityComparer,IComparer,IComparer; 或比较作为使用的参数。

Assert.That( myObj1, Is.EqualTo( myObj2 ).Using( myComparer ) );

所以在这种情况下你的比较器会是

    public class FooComparer : IEqualityComparer
    {
        public bool Equals(Foo x, Foo y)
        {
            if (x.A == y.A && x.B == y.B)
            {
                return true;
            }
            return false;
        }
        public int GetHashCode(Foo inst)
        {
            return inst.GetHashCode();
        }
    }

Nunit正在通过引用比较两个对象对象,因此它显示两个对象不相等。 您必须覆盖对象类中的Equals方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM