微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FluentAssertions是否支持字典的WithStrictOrdering?

如何解决FluentAssertions是否支持字典的WithStrictOrdering?

我正在比较两个简单的字典。我以相反的顺序将项目添加到词典中。我在FluentAssertions中使用了WithStrictOrdering选项,但是该测试通过了,我认为它应该失败:

var actual = new Dictionary<string,string>();
actual.Add("a","1");
actual.Add("b","2");

var expected = new Dictionary<string,string>();
expected.Add("b","2");
expected.Add("a","1");

actual.Should().BeEquivalentTo(expected,options => options.WithStrictOrdering());

当我在调试器中查看这些词典时,项目似乎按预期的顺序排列。我可以将WithStrictOrdering选项用于列表,并且其行为符合预期。 WithStrictOrdering选项可用于词典吗?

解决方法

比较两个字典时,

WithStrictOrdering被忽略。

在流利的断言中,如果满足以下条件,则认为两个字典是等效的:

  • 两个字典的长度相同,并且
  • 对于期望中的每个键,主题都包含该键的值(遵守其comparer),该值与期望中的相同键的值等效
  • li>

找到源代码here

关于通过调试器观察的顺序: 元素的顺序可能会更改,例如如果重新编排了字典。 通常,您不应该依赖Dictionary中元素的顺序。

documentation

出于枚举目的,字典中的每个项目均被视为代表值及其键的KeyValuePair 结构。物品的退还顺序是不确定的。

如果您仍要比较两个字典中的元素,并按照 undefined 的顺序检索元素,则一种变通方法是将Dictionary<string,string>转换为IEnumerable<object>

actual.Cast<object>().Should().BeEquivalentTo(expected,options => options.WithStrictOrdering());

注意:在Fluent Assertions V5中,使用Cast<KeyValuePair<string,string>>()也是可以的,但是在即将发布的V6中,实现IEnumerable<KeyValuePair<TKey,TValue>>的类型被视为类似于字典的类型,因此,Cast<object>()是必需的使Should()解析为GenericCollectionAssertions而不是GenericDictionaryAssertions

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。