Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
C# 对象的Assert.AreEqual()失败_C#_Nunit - Fatal编程技术网

C# 对象的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

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.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覆盖实现工作更容易。