C# 对象的Assert.AreEqual()失败
Assert.AreEqual()对于两个相同的对象失败。 获取错误为:: Assert.AreEqual失败。预期:。实际值: 以下是示例:C# 对象的Assert.AreEqual()失败,c#,nunit,C#,Nunit,Assert.AreEqual()对于两个相同的对象失败。 获取错误为:: Assert.AreEqual失败。预期:。实际值: 以下是示例: [TestMethod] public void testMultiplication() { Dollar five = new Dollar(5); Assert.AreEqual(new Dollar(10), five.times(2)); Assert.AreEqual(new Dollar(15), five.tim
[TestMethod]
public void testMultiplication()
{
Dollar five = new Dollar(5);
Assert.AreEqual(new Dollar(10), five.times(2));
Assert.AreEqual(new Dollar(15), five.times(3));
}
class Dollar
{
private int amount;
public Dollar(int amount)
{
this.amount = amount;
}
public Dollar times(int multiplier)
{
return new Dollar(amount * multiplier);
}
public bool equals(Object obj)
{
Dollar dollar = (Dollar) obj;
return amount == dollar.amount;
}
}
您需要在Dollar
中覆盖Equals
和GetHashCode
。默认值比较引用相等,因此两个不同的实例将不相同。将不使用当前的equals
方法
一个简单的实现:
public override bool Equals(object obj)
{
Dollar dollar = (Dollar) obj;
return amount == dollar.amount;
}
public override int GetHashCode()
{
return amount;
}
另一方面,尽管我通过示例认识到代码几乎是逐字逐句地来自测试驱动开发,但在C语言中,方法和属性都是Pascal大小写的,因此testmultiply
,Times
,<代码>等于等。可能是在继续时要考虑的事情。 < p>您需要重写<代码>等于< <代码> > <代码> GetHashCode <代码> > <代码>美元>代码>。默认值比较引用相等,因此两个不同的实例将不相同。将不使用当前的equals
方法
一个简单的实现:
public override bool Equals(object obj)
{
Dollar dollar = (Dollar) obj;
return amount == dollar.amount;
}
public override int GetHashCode()
{
return amount;
}
另一方面,尽管我通过示例认识到代码几乎是逐字逐句地来自测试驱动开发,但在C语言中,方法和属性都是Pascal大小写的,因此
testmultiply
,Times
,<代码>等于等。也许在你继续的时候要考虑一些东西。 <代码>等于 >与<代码>等于< < /代码>不一样。您从未使用过您的实现。这就是为什么在方法声明中使用override
。Equals
与Equals
不同。您从未使用过您的实现。这就是为什么在方法声明中使用override
。+1。不过,压倒平等也有其缺陷。比如必须重写GetHashCode,或者不应该对可变类型执行此操作,如果执行此操作,则应该真正重写==运算符。他们很好地总结了一下。在Assert.AreEqual
调用中使用自定义比较器可能会容易得多。根据您的测试需要定制自定义比较器也可能比使您的测试围绕Equals override实现更容易。+1。不过,压倒平等也有其缺陷。比如必须重写GetHashCode,或者不应该对可变类型执行此操作,如果执行此操作,则应该真正重写==运算符。他们很好地总结了一下。在Assert.AreEqual
调用中使用自定义比较器可能会容易得多。根据测试需要自定义自定义比较器可能比使测试围绕Equals覆盖实现工作更容易。