c# - 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
比较两个字典时被忽略。
在 Fluent Assertions 中,两个字典被认为是等效的,如果:
- 两个字典的长度相同,并且
- 对于期望中的每个键,主题包含该键的值(尊重其
comparer
),该值等同于期望中相同键的值。
源代码可在此处找到。
关于您通过调试器观察的顺序:元素的顺序可能会改变,例如,如果字典被重新散列。通常,您不应依赖于 a 中元素的顺序Dictionary
。
从文档
出于枚举的目的,字典中的每个项目都被视为表示值及其键的 KeyValuePair<TKey,TValue> 结构。返回项目的顺序未定义。
如果您仍然想比较两个字典中的元素,尊重检索元素的未定义顺序,一种解决方法是Dictionary<string,string>
将IEnumerable<object>
actual.Cast<object>().Should().BeEquivalentTo(expected, options => options.WithStrictOrdering());
注意:在 Fluent Assertions V5 中 usingCast<KeyValuePair<string, string>>()
也可以使用,但在即将到来的 V6 中,类型实现IEnumerable<KeyValuePair<TKey, TValue>>
被认为是类字典类型,因此Cast<object>()
有必要使用Should()
resolve toGenericCollectionAssertions
而不是GenericDictionaryAssertions
.
推荐阅读
- html - 如何从报纸 3k 对象中删除不需要的类和标签?
- css - Bootstrap 4 - 卡片布局中的文本对齐
- angular - Angular 组件继承和继承订阅
- python - 为什么 pandas 在简单的数学运算上比 numpy 快?
- javascript - 这里需要 Redux 还是不需要?
- machine-learning - 无法理解这个 k-fold 验证算法是如何工作的?
- python - 小数点后只有两位数的条目
- python - IDEA算法密钥正在制作不正确的解密文本
- firebase - 在颤动的火力基础上更改密码
- python - 在 Django views.py 中总结 2 个值