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);
在上面的代码中,expectedItems
和 actualItems
是你的列表
现在想想在第二次迭代期间会发生什么(下面的部分)将被执行?
actualItems[index].Equals(expectedItems[index])
因为actualItems[1]
是null
所以它抛出空引用异常
【讨论】:
Fluent Assertions 有一些解决方法吗?或者如果我确定空值对于测试的集合是正常的,我必须在单元测试中使用循环? 现在我建议在调用 equal 之前确保集合中没有 null 并在fluentassertion
的 codeplex
站点上提交错误。另一种选择可能是下载源代码并自行修复:)
@tensorsigma - 我建议不要下载和更改源代码。一旦您开始添加自定义修复程序,您将不愿意下载项目的更新,因为您必须重新添加所有这些内容。当然,除非项目所有者接受您的更改并将它们合并到项目代码库中。
已在 1.7.0 发布分支和主干中修复。如果需要,可以直接从源代码编译更新版本:- Dennis Doomen以上是关于FluentAssertions Should.Equal 在集合上,包含空值的主要内容,如果未能解决你的问题,请参考以下文章
FluentAssertions 是不是支持字典的 WithStrictOrdering?
Fluentassertions.ShouldBeEquivalentTo 中的 Ignoredatamember
FluentAssertions:int.Should().Equals 返回错误的结果?
使用 FluentAssertions API 4.x 语法迁移 xunit 项目以使用 FluentAssertions v5.x 版本运行