我正在进行测试,但如果失败,我不知道为什么:
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
}
}
我尝试了很多方法甚至将测试样本放入课堂,但无论如何它都无法正常工作。 请帮忙!
答案 0 :(得分:7)
问题是NUnit测试StatResult
的两个实例的相等性的方式。因为您没有实现任何形式的相等比较运算符,所以相等性检查默认为实例的引用。因为它们是两个不同的实例,所以它们的引用是不同的。
有关在对象中实现相等性的更多信息,请参阅this article。
答案 1 :(得分:5)
我可以看到两个引用引用具有相同属性的对象,但这不是在这里测试的内容。它正在检查它们是否引用了相同的对象或它们是否相等。您的StatResult
类不会覆盖Equals
/ GetHashCode
,因此具有相同值的两个对象将被视为“不同”以进行测试。
您应该覆盖Equals
和GetHashCode
,以便将两个对象视为相等。我还建议使类型不可变,以及遵循属性的正常.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()。目前,它正在检查每个列表中的第一项是否是对同一对象的引用。