我有一个对象
public class Foo
{
public string A{ get; set; }
public string B{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在比较SUT的返回值,当它为A和B返回null时,就像这样.
Assert.That(returnValue, Is.EqualTo(new Foo { A = null, B = null}));
Run Code Online (Sandbox Code Playgroud)
这没用,所以我试过了
Assert.That(returnValue, Is.SameAs(new Foo { A = null, B = null}));
Run Code Online (Sandbox Code Playgroud)
这也不起作用.
我得到一条消息
Expected: same as <Namespace+Foo>
But was: <Namespace+Foo>
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
从nunit文档,
在检查用户定义的类的相等性时,NUnit在预期的对象上使用Equals覆盖.如果忽略覆盖Equals,则可能会出现非相同对象的故障.特别是,重写operator ==而不覆盖Equals没有任何效果.
但是,您可以提供自己的比较器来测试属性的值是否相等.
如果测试相等性的默认NUnit或.NET行为无法满足您的需求,则可以通过"使用"修饰符提供自己的比较器.当与EqualConstraint一起使用时,您可以提供IEqualityComparer,IEqualityComparer,IComparer,IComparer; 或比较作为使用的参数.
Assert.That( myObj1, Is.EqualTo( myObj2 ).Using( myComparer ) );
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下你的比较器会是
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();
}
}
Run Code Online (Sandbox Code Playgroud)