NUnit, CollectionAssert.AreEquivalent (..., ...), C # Вопрос - PullRequest
6 голосов
/ 19 марта 2010

Я новичок в NUnit и ищу объяснение, почему этот тест не проходит?

При выполнении теста я получаю следующее исключение.

NUnit.Framework.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);

    }
}

Ответы [ 2 ]

10 голосов
/ 19 марта 2010

Чтобы определить, равны ли 2 коллекции, NUnit должен в конечном итоге сравнить значения в коллекции. В этом случае значения имеют тип ExampleClass, который является class. Он не реализует никакого теста на равенство (такого как переопределение 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<TKey,TValue>, хотя вы захотите вернуться к этому.

6 голосов
/ 19 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...