FluentAssertions:断言集合包含“IsEquivalentTo”元素

12

我陷入了一个我认为很简单的例子中。 我想断言一个对象集合包含一个等同于给定对象的对象。就像:col.ShouldContainEquivalentTo(obj)

var objectList1 = new List<SomeClass> { new SomeClass("A"), new SomeClass("B"), new SomeClass("C") };
var objectList2 = new List<SomeClass> { new SomeClass("C"), new SomeClass("B"), new SomeClass("A") };

objectList1.ShouldAllBeEquivalentTo(objectList2); //this works
objectList2.ShouldContainEquivalentTo(new SomeClass("B")); //method does not exist. How can I achieve sthg like that
我希望能够基于对象的值进行比较,就像ShouldBeEquivalentToShouldAllBeEquivalentTo的工作方式一样。不应该需要编写自己的相等比较器。
BR Matthias
4个回答

25

我终于有时间实现了这个功能,现在它已经可以在FluentAssertions的5.6.0版本中使用

现在这个功能可用!

var objectList = new List<SomeClass> { new SomeClass("A"), new SomeClass("B"), new SomeClass("C") };
objectList.Should().ContainEquivalentOf(new SomeClass("A"));

马蒂亚斯修士


现在,我想提供一个IEnumerable<SomeClass>来验证所有提供的对象的等效性是否存在。 - comecme
现在,我想要类似于 dictionary.Should().ContainKeyEquivalentOf("key").WhoseValue.Should().Be("something"); 这样的东西。 - user1007074

6

现在已经有解决方案。请查看被接受的答案。停止点赞这个变通方法。^^


看来我太天真了,实际上并没有一种方法完全符合我的要求。感谢@Nkosi指出。

为了总结这个话题:我们最终得到了类似于以下内容:

objectList.Should().Contain(dto=>dto.Id == expectedDto.Id).Which.ShouldBeEquivalentTo(expectedDto)

只有当您拥有某种唯一标识符(id、name等)时,此方法才能正常运行(编辑:非常好用)。但至少它会对所有其他属性使用内置的 ShouldBeEquivalentTo 方法!

我创建了一个功能请求

感谢所有的输入!

敬礼,Matthias


2

您可以使用框架已有的功能来实现所需的行为。

这是一种丑陋的hack,但应该能够完成工作。

public static class FluentAssertionsEx {

    public static void ShouldContainEquivalentTo<T>(this IEnumerable<T> subject, object expectation, string because = "Expected subject to contain equivalent to provided object", params object[] becauseArgs) {
        var expectedCount = subject.Count();
        var actualCount = 0;
        try {
            foreach (var item in subject) {
                item.ShouldBeEquivalentTo(expectation);
            }
        } catch {
            actualCount++;
        }
        expectedCount.Should().NotBe(actualCount, because, becauseArgs);
    }
}

1
您可以这样做:

objectList2.Should().Contain(x => x.Property == "B");

其中Property被替换为SomeClass构造函数设置的任何属性。


“B”只是一个示例,用于演示差异。在实际情况中,会有很多属性。此外,像这样编写代码与编写相等比较器几乎是相同的。在我看来,应该已经有了通用解决方案,因为ShouldBeEquivalentToShouldAllBeEquivalentTo已经以这种方式工作。 - Matthias
你也可以执行以下代码: objectList2.Should().Contain(new SomeClass("B")) 这将在所有属性上应用equals方法。 请注意,您必须为SomeClass实现GetHashCode()方法。当重写Equals方法时,为什么重写GetHashCode方法很重要? - CBinet
1
@Matthias 不要做那个假设。目前不存在那个功能。你可以在Github上向开发者提出问题或功能请求。 - Nkosi

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