我是NUnit的新手,正在寻找一个关于为什么这个测试失败的探索?
运行测试时出现以下异常.
NUnit.Framework.AssertionException: Expected: equivalent to < <….ExampleClass>,<….ExampleClass> >
But was: < <….ExampleClass>,<….ExampleClass> >
using NUnit.Framework; using System.Collections.ObjectModel; public class ExampleClass { public ExampleClass() { Price = 0m; } public string Description { get; set; } public string SKU { get; set; } public decimal Price { get; set; } public int Qty { get; set; } } [TestFixture] public class ExampleClassTests { [Test] public void ExampleTest() { var collection1 = new Collection<ExampleClass> { new ExampleClass {Qty = 1,SKU = "971114FT031M"},new ExampleClass {Qty = 1,SKU = "971114FT249LV"} }; var collection2 = new Collection<ExampleClass> { new ExampleClass {Qty = 1,SKU = "971114FT249LV"} }; CollectionAssert.AreEquivalent(collection1,collection2); } }
解决方法
为了确定2个集合是否相等,NUnit最终必须比较集合中的值.在这种情况下,值的类型为ExampleClass类型.它没有实现任何相等性测试(例如重写Equals和GetHashCode),因此NUnit最终会进行参考比较.这将失败,因为每个集合包含不同的Example实例,即使这些字段具有相同的值.
您可以通过将以下内容添加到ExampleClass来解决此问题
public override bool Equals(object o) { var other = o as ExampleClass; if ( other == null ) { return false; } return this.Description == other.Description && this.SKU == other.SKU && this.Price == other.Price && this.Qty == other.Qty; } public override int GetHashCode() { return 1; }
注意:我为GetHashCode选择值1,因为这是一个可变类型,并且可变类型上GetHashCode唯一真正安全的返回值是常量.如果您打算将其用作词典中的键< TKey,TValue>虽然你想重新审视这个.