xUnit Равно две одинаковые коллекции, одинакового порядка, одинаковых типов, возвращает false - PullRequest
0 голосов
/ 07 марта 2019

Разве метод xUnit Equal не должен возвращать true, если две коллекции равны, то есть иметь одинаковые объекты в одном и том же порядке?

Пример:

var result = new List<item>()
            {
                new item()
                {
                    TypeId = typesEnum.Integer,
                    Code = "code"
                },
                new item()
                {
                   TypeId = typesEnum.Integer,
                   Code = "code2"
                }
            }

и Assert.Equal (Ожидаемый результат, результат) возвращает ложь.

и у меня точно такой же список в ожидаемом результате, проверено одно за другим, каждое свойство, тип, все. Когда я пишу свой собственный IEqualityComparer и сравниваю каждое свойство класса элемента в нем, тогда результат верен. Но компаратор по умолчанию возвращает false. Это то, как это должно работать для xUnit? Если так, то вопрос в том, как сравнить, если две коллекции равны, как эквивалент?

Пользовательский компаратор выглядит так:

internal class ItemComparer : IEqualityComparer<Item>
{
    public bool Equals(Item x, Item y)
    {
        return x.Code.Equals(y.Code) && x.TypeId.Equals(y.TypeId)
    }

    public int GetHashCode(Item obj)
    {
        return obj.GetHashCode();
    }
}

Вот ссылка на похожий вопрос: CLICK

И ответ таков: он должен работать так, как я думаю, без написания собственного компаратора. Вопрос в том, почему не так?

Я использую xUnit 2.4.1

1 Ответ

0 голосов
/ 07 марта 2019

Это не проблема или специфика XUnit, а то, как работает C #. Когда у вас есть два не примитивных объекта с одинаковыми значениями внутри, они эквивалентны, но не равны - внутренне они имеют разные ссылки на память для каждого свойства. Вы даже можете попробовать сравнить оба, используя == или .Equals() внутри оператора if, и он вернет false.

Этот ответ очень хорошо объясняет эту тему

Что вы могли бы сделать:

  • Перезаписать операторы сравнения, использовать Assert.True() и сравнить их, чтобы получить истинное значение;

  • Используйте библиотеку, которая обеспечивает сравнение по эквивалентности, например FluentAssertion : object1.Should().BeEquivalentTo(object2);

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