FluentAssertions的ShouldBeEquivalentTo()与Should().BeEquivalentTo()的区别

7

我有一个测试,用于验证方法的集合输出。这个测试的变体通过了:

    [TestMethod, TestCategory("BVT")]
    public void TheStatusesAreReturned()
    {
        var expectedUnprocessedStatuses = new List<FileUploadStatus>
            {
                FileUploadStatus.InProcess,
                FileUploadStatus.Pending,
            };

        Sut.GetUnprocessedStatuses()
            .Should()
            .BeEquivalentTo(expectedUnprocessedStatuses);
    }

这个测试变体失败了,报错信息是"期望的item[0]应该是InProcess状态,但实际上是Pending状态":
    [TestMethod, TestCategory("BVT")]
    public void TheStatusesAreReturned2()
    {
        var expectedUnprocessedStatuses = new List<FileUploadStatus>
            {
                FileUploadStatus.InProcess,
                FileUploadStatus.Pending,
            };

        Sut.GetUnprocessedStatuses()
            .ShouldBeEquivalentTo(expectedUnprocessedStatuses);
    }

明显地,ShouldBeEquivalentTo 关注集合项目的顺序,而 BeEquivalentTo 则不关注。为什么这2种方法之间的等价性概念不同呢?

1个回答

13

你说得对。Should().BeEquivalentTo()在验证等价性时使用了各个项的Equals()实现,并且从版本1就已经存在。在FA 2.0中引入了更新的ShouldBeEquivalentTo()函数,它进行了深度结构比较,并报告任何差异。对于2.1版本,我将更改默认行为,使其更像集合等价性。


1
好的,我期待更新。我经常使用Should().BeEquivalentTo()! - Matt Slavicek
2
这是一篇旧文章,但是ShouldBeEquivalentTo自v2.1版本起将会忽略集合中项目的顺序。 - Dennis Doomen

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