Я плохо знаком с 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);
}
}
Для того чтобы определить, равны ли две коллекции, 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
, то вам стоит вернуться к этому.
Вам нужно реализовать Equals
и GetHashCode
в вашем ExampleClass
. Без этого NUnit выполняет проверку равенства ссылок ("это точно такой же объект?"), а не равенства значений ("эти объекты выглядят одинаково?").