NUnit, CollectionAssert. AreEquivalent (…, …), вопрос о C#

Я плохо знаком с NUnit и поиском explination относительно того, почему этот тест перестал работать?

Я получаю следующее исключение при запущении теста.

NUnit. Платформа. AssertionException: Ожидаемый: эквивалентный <<.... ExampleClass>, <.... ExampleClass>>, Но был: <<.... 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 = "971114FT031M"},
                     new ExampleClass
                         {Qty = 1, SKU = "971114FT249LV"}
                 };

        CollectionAssert.AreEquivalent(collection1, collection2);

    }
}
6
задан 19 March 2010 в 20:17
поделиться

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; }

Примечание: Я выбрал значение 1 для GetHashCode, потому что это изменяемый тип, а единственное действительно безопасное возвращаемое значение для GetHashCode для изменяемого типа - это константа. Если вы собираетесь использовать этот тип в качестве ключа в Dictionary, то вам стоит вернуться к этому.

10
ответ дан 8 December 2019 в 14:42
поделиться

Вам нужно реализовать Equals и GetHashCode в вашем ExampleClass. Без этого NUnit выполняет проверку равенства ссылок ("это точно такой же объект?"), а не равенства значений ("эти объекты выглядят одинаково?").

6
ответ дан 8 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: