Как проверить, находятся ли две коллекции объектов в разном порядке на основе одного из свойств объектов? - PullRequest
0 голосов
/ 17 июня 2020

Я достаточно новичок в модульном тестировании, и у меня возникла проблема. У меня есть две коллекции (колоды), содержащие объекты (карты), причем карты являются объектами с идентификатором, значением, мастью и т. Д. c.

Я пишу модульный тест, чтобы проверить, работает ли мой метод Shuffle (), поэтому я хочу проверить, есть ли в списке не перетасованная колода (которая создает 52 карты с идентификаторами 0-51) и перетасованная колода. такой же порядок или нет. Очевидно, что карты являются уникальными объектами, даже если они имеют одинаковые значения. Таким образом, по определению, проверка на совпадение всегда приводит к ложному результату. Я очень, очень новичок в NUnit (только что установил его за два дня go), и я все еще борюсь с синтаксисом здесь и там.

В идеале я бы хотел, чтобы утверждение проверяло, порядок обеих коллекций одинаков, причем порядок определяется идентификаторами карт, потому что как объекты они все уникальны и, следовательно, всегда в разном порядке. Теперь я могу проверить, не упорядочена ли перетасованная колода по идентификатору, но это будет плохим модульным тестом, поскольку предполагается, что не перемешанная колода всегда упорядочивается по идентификатору. Я также могу проверить не перетасованную колоду, но кажется довольно неэлегантным тестировать ее таким образом без фактического сравнения двух колод.

Я также хочу, чтобы утверждение проверяло, что мой конструктор колоды создает только уникальные идентификаторы, но опять же, все объекты в коллекции всегда уникальны, но я не знаю синтаксиса (если он существует) для проверки уникальности одного указанного c свойства всех карточек.

Я гуглил как сумасшедший , и я пробовал много разных синтаксических вещей с помощью грубой силы, но сейчас я в растерянности. Надеюсь, вы, ребята, можете мне помочь, заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 17 июня 2020

Чтобы определить, находятся ли карты в одном порядке с помощью свойства Id, вы можете просто выделить это свойство в IEnumerable, а затем использовать для них метод расширения System.Linq SequenceEqual:

// Where 'unshuffled' and 'shuffled' are both 'List<Card>' objects
var areEqual = unshuffled.Select(c => c.Id).SequenceEqual(shuffled.Select(c => c.Id));

В качестве альтернативы вы можете переопределить Equals и GetHashCode в классе Card, а затем использовать , что для сравнения равенства. Это поможет в сравнении других карт, которые могут потребоваться:

public class Card : IEquatable<Card>
{
    public int Id { get; set; }

    public bool Equals(Card other)
    {
        return Id == other?.Id;
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as Card);
    }

    public override int GetHashCode()
    {
        return Id;
    }
}

Теперь наш код сравнения немного проще:

var areEqual = unshuffled.SequenceEqual(shuffled);
2 голосов
/ 17 июня 2020

Вы можете использовать SequnceEqual с LINQ Select вот так:

class Card
{
    public int CardId { get; set; }
}

Assert.IsTrue(new[] { new Card {CardId = 1}, new Card {CardId = 2}}
        .Select(c => c.CardId)
        .SequenceEqual(new[] {1,2}));

Также я бы рекомендовал проверить Fluent Assertions библиотеку, иногда не очень очевидно, как что-то там делать, но в целом он имеет несколько очень полезных функций.

1 голос
/ 17 июня 2020

Самый простой подход для вашего случая с использованием только функций NUnit:

Assert.That(shuffled, Is.Not.EqualTo(unshuffled);

Обратите внимание, что это предполагает, что вы переопределили Equals для объекта карты.

Почему это работает ...

  1. Все ваши колоды содержат 52 карты
  2. Вы также тестируете (я предполагаю это), что каждая колода содержит правильные 52 карты.
  3. NUnit Равенство коллекций определяется для каждой пара элементов, взятых по порядку и равных.

Для полного набора тестов я, вероятно, хотел бы убедиться, что размер колоды не изменился и что все элементы были уникальными. Что-то вроде ...

Assert.That(shuffled, Is.EqualTo(DECK_SIZE);
Assert.That(shuffled, Is.Unique);
Assert.That(shuffled, Is.Not.EqualTo(unshuffled));
...