FluentAssertions Should.Equal 在集合上,包含空值

Posted

技术标签:

【中文标题】FluentAssertions Should.Equal 在集合上,包含空值【英文标题】:FluentAssertions Should.Equal on collections, containing nulls 【发布时间】:2012-02-17 20:46:02 【问题描述】:

当我尝试将两个集合与空值进行比较时,FluentAssertions 似乎因 NullReferece 异常而失败

    [Test]
    public void DeepWithNulls()
    
        var l1 = new List<string>  "aaa", null ;
        var l2 = new List<string>  "aaa", null ;

        l1.Should().Equal(l2);
    

比较在没有空值的集合上按预期工作。

【问题讨论】:

【参考方案1】:

这是因为 Fluent Assertion 在集合比较逻辑的深处使用以下代码

 for (int index = 0; index < expectedItems.Length; index++)
            
                verification.ForCondition((index < actualItems.Length) && actualItems[index].Equals(expectedItems[index]))
                    .FailWith("Expected " + Verification.SubjectNameOr("collection") +
                        " to be equal to 0reason, but 1 differs at index 2.", expected, Subject, index);
            

在上面的代码中,expectedItemsactualItems 是你的列表

现在想想在第二次迭代期间会发生什么(下面的部分)将被执行?

actualItems[index].Equals(expectedItems[index])

因为actualItems[1]null 所以它抛出空引用异常

【讨论】:

Fluent Assertions 有一些解决方法吗?或者如果我确定空值对于测试的集合是正常的,我必须在单元测试中使用循环? 现在我建议在调用 equal 之前确保集合中没有 null 并在 fluentassertioncodeplex 站点上提交错误。另一种选择可能是下载源代码并自行修复:) @tensorsigma - 我建议不要下载和更改源代码。一旦您开始添加自定义修复程序,您将不愿意下载项目的更新,因为您必须重新添加所有这些内容。当然,除非项目所有者接受您的更改并将它们合并到项目代码库中。 已在 1.7.0 发布分支和主干中修复。如果需要,可以直接从源代码编译更新版本:- Dennis Doomen

以上是关于FluentAssertions Should.Equal 在集合上,包含空值的主要内容,如果未能解决你的问题,请参考以下文章

FluentAssertions 是不是支持字典的 WithStrictOrdering?

FluentAssertions 不应该包含失败

Fluentassertions.ShouldBeEquivalentTo 中的 Ignoredatamember

FluentAssertions:int.Should().Equals 返回错误的结果?

使用 FluentAssertions API 4.x 语法迁移 xunit 项目以使用 FluentAssertions v5.x 版本运行

FluentAssertions 断言单个对象的多个属性