我有两个具有不同项目类型的集合,例如:
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
我在这里想念什么?