у меня есть две коллекции с различными типами элементов, например:Сравнение коллекций с различными типами элементов
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
так или иначе.
Что мне здесь не хватает?
Спасибо за ваш ответ @DennisDoomen! Я обновил свой вопрос с новой проблемой, с которой сталкиваюсь после использования вашего предложения. –
Извините, но я никогда не говорил о 'ShouldBeEquivalentTo', это было ваше предложение.То, что я имел в виду с самого начала моего вопроса (и это даже смело), - это ** использование моего собственного сопоставителя равенств ** для определения пользовательских правил равенства между двумя разными типами элементов. И как самый близкий пример, я указал на '.Should(). Equal (клиенты, (c1, c2) => c1.Name == c2.Name)', который позволяет использовать пользовательский предикат для проверки равенства. Поэтому мое обновление не является новым вопросом, это просто более конкретный пример, чтобы очистить мою точку зрения. –
Стрелять. Ты прав. Мои неудачи и мои извинения. –