比较具有不同项目类型的集合

本文关键字:类型 集合 项目 比较 | 更新日期: 2023-09-27 18:33:18

我有两个具有不同项目类型的集合,例如:

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

是否可以使用我自己的相等比较器与 FluentAssertions 断言具有不同项目类型的两个集合以任何顺序包含相等的项目

官方 FA 文档中最相关的示例认为这两个集合是相同的类型:

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

在我的情况下使用此方法的一种可能的解决方案是基于collection2中的项创建一个新的List<Type1>集合,并使用它而不是上面示例中的customers
但有时这是不可能的,实际上闻起来像头顶。

我想知道是否有类似的方法使用上述 FA 优雅,但适用于具有不同项目类型的集合?

更新 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

我在这里错过了什么?

比较具有不同项目类型的集合

ShouldBeEquivalentTo就是你需要的。默认情况下,它将确保每个集合包含结构上以任何顺序等效的项。然后,您可以使用 Using/When 选项来定义应如何比较Type1Type2。像这样:

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