如何解决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
中元素的顺序。
出于枚举目的,字典中的每个项目均被视为代表值及其键的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 举报,一经查实,本站将立刻删除。