2014-12-04 3 views
3

у меня есть две коллекции с различными типами элементов, например:Сравнение коллекций с различными типами элементов

var collection1 = new List<Type1>(); 
var collection2 = new List<Type2>(); 

Можно ли утверждать, что две коллекции с различными типами элементов содержат одинаковые элементы в любом порядке, используя мои собственные равенство с FluentAssertions?

Наиболее родственный пример из the official FA documentation считает, что оба коллекции имеют одинаковый тип:

persistedCustomers.Should().Equal(customers, (c1, c2) => c1.Name == c2.Name); 

Одно из возможных решений, чтобы использовать этот подход для моей ситуации, чтобы создать новую List<Type1> коллекции на основе элементов из collection2 и используйте его вместо customers в приведенном выше примере.
Но иногда это просто невозможно и на самом деле пахнет как накладные расходы.

Мне интересно, есть ли подобный подход, который использует элегантность FA, как и выше, но подходит для коллекций с разными типами предметов?

UPDATE 1 (пытаясь использовать @DennisDoomen предложение):

Давайте более конкретный пример.
Предположим, у нас есть List<DateTime> ожидаемых значений, что представляет даты одного месяца:

var expectation = new List<DateTime>(); 

Метод тестирования возвращает List<int> чисел день:

var actual = new List<int>(); 

Мы хотим, чтобы утверждать, что набор дневные числа, возвращаемые методом тестирования, такие же, как набор, состоящий из значений DateTime.Day списка ожиданий, то есть:

Assert.AreEqual(expectation[0].Day, actual[0]); 
    Assert.AreEqual(expectation[1].Day, actual[1]); 
... 
    Assert.AreEqual(expectation[expectation.Count - 1].Day, actual[actual.Count - 1]); 

(но без ограничения порядка, которое я не демонстрирую в этом примере).

Я пытаюсь использовать @DennisDoomen предложение следующим образом:

actual.ShouldBeEquivalentTo(
     expectation, 
     options => options.Using<int>(
      ctx => ctx.Subject.Should().Be(ctx.Expectation.Day)).WhenTypeIs<int>()); 

Проблема заключается в том, что ctx.Expectation здесь тип int, а не DateTime, так что я не могу получить DateTime.Day так или иначе.

Что мне здесь не хватает?

ответ

5

ShouldBeEquivalentTo - это то, что вам нужно. По умолчанию он гарантирует, что каждая коллекция содержит элементы, которые являются структурно эквивалентными в любом порядке. Затем вы можете использовать параметры Using/When, чтобы определить, как следует сравнивать Type1 и Type2. Что-то вроде:

collection1.ShouldBeEquivalentTo(collection2, options => options 
    .Using<Type1>(t1 => ctx.Subject.Should().Be(ctx.Expectation) 
    .WhenTypeIs<Type1>(); 
+1

Спасибо за ваш ответ @DennisDoomen! Я обновил свой вопрос с новой проблемой, с которой сталкиваюсь после использования вашего предложения. –

+1

Извините, но я никогда не говорил о 'ShouldBeEquivalentTo', это было ваше предложение.То, что я имел в виду с самого начала моего вопроса (и это даже смело), ​​- это ** использование моего собственного сопоставителя равенств ** для определения пользовательских правил равенства между двумя разными типами элементов. И как самый близкий пример, я указал на '.Should(). Equal (клиенты, (c1, c2) => c1.Name == c2.Name)', который позволяет использовать пользовательский предикат для проверки равенства. Поэтому мое обновление не является новым вопросом, это просто более конкретный пример, чтобы очистить мою точку зрения. –

+0

Стрелять. Ты прав. Мои неудачи и мои извинения. –