NUnit: API для проверки, совпадают ли два словаря - PullRequest
2 голосов
/ 01 февраля 2010

С учетом двух словарей

var dictA = new Dictionary<string, classA>();
var dictB = new Dictionary<string, classA>();

Как проверить, совпадают ли эти два словаря? Подвох в том, что я не могу использовать значение по умолчанию classA.Equals для сравнения пар значений. Вместо этого тест будет проходить тогда и только тогда, когда все объекты типа classA в словарях должны удовлетворять моему собственному обычаю IEqualityComparer<ClassA>.

В частности, я смотрю на что-то вроде

CollectionAssert.AreEquivalent(dictA, dictB, new ClassEqualityComparer());

с ClassEqualityComparer наследуется от IEqualityComparer<ClassA> или эквивалентным. Я не возражаю, если мне нужно создать подкласс типа NUnit IEqualityComparer (например, IResolveConstraint), но самое главное, что метод Assert должен быть похож на

Assertion(dictA, dictB, EqualityComparer)

Или что-то еще более простое; Я не хочу использовать Assert.That, а затем реализовать тип IResolveConstraint, который встречается на страницах, просто чтобы проверить, совпадают ли два словаря.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 01 февраля 2010

Итак, я думаю, вам нужно проверить, что словарь «B» содержит все те же ключи, что и «A», и наоборот, а затем использовать ваш компаратор для сравнения каждого значения:

Assert.IsTrue(dictA.Keys.All(k => dictB.ContainsKey(k));
Assert.IsTrue(dictB.Keys.All(k => dictA.ContainsKey(k));

var cmp = new ClassEqualityComparer();
Assert.IsTrue(dictA.Keys.All(k => cmp.Equals(dictA[k], dictB[k]));

Будет ли это работать?

0 голосов
/ 01 февраля 2010

Если вы контролируете создание этих словарей в своих модульных тестах, вы можете передать Comparer соответствующему конструктору .

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