NUnit的。值[0]的值不同

时间:2012-03-13 14:07:34

标签: c# .net winforms unit-testing nunit

我正在进行测试,但如果失败,我不知道为什么:

Proj.Tests.StatTests.GetResults_RegularPage_ReturnListOfResults:
  Expected and actual are both <System.Collections.Generic.List`1[Proj.Classes.StatResult]> with 50 elements
  Values differ at index [0]
  Expected: <test;98318>
  But was:  <test;98318>

正如您所看到的,价值是相同的。 这是一些代码:

public class StatResult
    {
        public string word { get; set; }
        public UInt64 views { get; set; }

        public override string ToString()
        {
            return String.Format("{0};{1}", word, views);                
        }
    }    

    [Test]
    public void GetResults_RegularPage_ReturnListOfResults()
    {
        // Arrange            
        WordStat instance = new WordStat(Constants.WordStatRegularPage);
        // Act
        List<StatResult> results = instance.GetResults();
        // Assert
        Assert.AreEqual(results, new List<StatResult>
        {
            new WordStatResult { word ="test", views = 98318},
            new WordStatResult { word ="test board", views = 7801},
            //... I shorted it
        }

}

我尝试了很多方法甚至将测试样本放入课堂,但无论如何它都无法正常工作。 请帮忙!

3 个答案:

答案 0 :(得分:7)

问题是NUnit测试StatResult的两个实例的相等性的方式。因为您没有实现任何形式的相等比较运算符,所以相等性检查默认为实例的引用。因为它们是两个不同的实例,所以它们的引用是不同的。

有关在对象中实现相等性的更多信息,请参阅this article

答案 1 :(得分:5)

我可以看到两个引用引用具有相同属性的对象,但这不是在这里测试的内容。它正在检查它们是否引用了相同的对象或它们是否相等。您的StatResult类不会覆盖Equals / GetHashCode,因此具有相同值的两个对象将被视为“不同”以进行测试。

您应该覆盖EqualsGetHashCode,以便将两个对象视为相等。我还建议使类型不可变,以及遵循属性的正常.NET命名约定:

public sealed class StatResult : IEquatable<StatResult>
{
    public string Word { get; private set; }
    public UInt64 Views { get; private set; }

    public StatResult(string word, ulong views)
    {
        this.word = word;
        this.views = views;
    }

    public override string ToString()
    {
        return String.Format("{0};{1}", word, views);                
    }

    public override int GetHashCode()
    {
        int hash = 23;
        hash = hash * 31 + Word == null ? 0 : Word.GetHashCode();
        hash = hash * 31 + Views.GetHashCode();
        return hash;
    }

    public override bool Equals(object other)
    {
        return Equals(other as StatResult);
    }

    public bool Equals(StatResult other)
    {
        return other != null &&
               this.Word == other.Word &&
               this.Views == other.Views;
    }
}

您的构造将改为:

new StatResult("test", 98318),
new StatResult("test board", 7801),

(同样在您的生产代码中)。

答案 2 :(得分:1)

您需要覆盖Equals()和GetHashCode()。目前,它正在检查每个列表中的第一项是否是对同一对象的引用。