与 expect() 函数比较时,包含 List 的 Dartz Right 会抛出错误
Posted
技术标签:
【中文标题】与 expect() 函数比较时,包含 List 的 Dartz Right 会抛出错误【英文标题】:Dartz Right containing List throws Error when comparing with expect() function 【发布时间】:2020-09-01 04:20:40 【问题描述】:这样的简单代码
expect(Right(['Two', 'Three']), equals(Right(['Two', 'Three'])));
抛出错误:
ERROR: Expected: Right<dynamic, List>:<Right([Two, Three])>
Actual: Right<dynamic, List>:<Right([Two, Three])>
我做错了什么?两个列表是相同的,并且都具有相等的元素。
【问题讨论】:
【参考方案1】:Dart 默认检查引用相等性,在这里您正在组合两个具有相等值但不相等引用的数组。常量列表将按照您的预期运行,而运行时定义的列表则不会。
final a = ['Two', 'Three'] == ['Two', 'Three']; // false
final b = const ['Two', 'Three'] == const ['Two', 'Three']; // true
这可能会令人困惑,因为这会过去:
expect(['Two', 'Three'], equals(['Two', 'Three']));
测试库具有迭代器的默认匹配器,并将进行深度检查以匹配列表中的所有字符串,因此上述通过。 Right
数据类型并非如此,它将回退到 ==
-operator 并因此失败,因为它将返回 false ,如上所示。
Dartz 有一个列表实现(不可变),用于检查将成功的深度相等,或者如上所述使用 const:
final a2 = ilist('Two', 'Three') == ilist('Two', 'Three') // true
expect(Right(ilist(['Two', 'Three'])), equals(Right(ilist(['Two', 'Three']))));
expect(Right(const ['Two', 'Three']), equals(Right(const ['Two', 'Three'])));
【讨论】:
以上是关于与 expect() 函数比较时,包含 List 的 Dartz Right 会抛出错误的主要内容,如果未能解决你的问题,请参考以下文章
当列包含`List`而不是`Tuple`时,熊猫比较运算符`==`无法按预期工作
likely(x)与unlikely(x)函数,即__builtin_expect的使用