比较包含不同项类型集合的方法对比

3
我有两个不同类型的集合,例如:

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。你觉得我错了哪里?
1个回答

5

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

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

1
感谢您的回复,@DennisDoomen!在使用您的建议后,我遇到了一个新的问题,我已经更新了我的问题。 - Alexander Abakumov
1
抱歉,但我从未谈论过ShouldBeEquivalentTo,那是你的建议。我一开始就想表达的意思(甚至加粗了)是使用自己的相等比较器来定义两种不同项目类型之间的自定义相等规则。而且,我指出了.Should().Equal(customers, (c1, c2) => c1.Name == c2.Name)作为最接近的例子,它允许使用自定义谓词进行相等性检查。因此,我的更新不是一个新问题,只是一个更具体的例子,以澄清我的观点。 - Alexander Abakumov
1
非常感谢您的回答,虽然这是我的荣幸 :) 那么,在FA中有没有适合我情况的方法呢? - Alexander Abakumov
1
不是真的。但是你可以实现一个自定义的 IAssertionRule 并在调用 ShouldBeEquivalentTo 时将其添加到 options 中,不过这需要更多的工作。 - Dennis Doomen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接