3

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

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

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

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

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

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

我想知道是否有一种类似的方法可以像上面那样使用 FA 优雅但适用于具有不同项目类型的集合?

更新 1(尝试使用@DennisDomen 建议):

让我们举一个更具体的例子。
假设我们有一个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

我在这里想念什么?

4

1 回答 1

5

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

collection1.ShouldBeEquivalentTo(collection2, options => options 
   .Using<Type1>(t1 => ctx.Subject.Should().Be(ctx.Expectation) 
   .WhenTypeIs<Type1>(); 
于 2014-12-05T07:28:07.683 回答