NUnit,CollectionAssert.AreEquivalent(…,…),C#Question

前端之家收集整理的这篇文章主要介绍了NUnit,CollectionAssert.AreEquivalent(…,…),C#Question前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是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>虽然你想重新审视这个.

猜你在找的C&C++相关文章