与 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的使用

mac使用expect自动登录跳版机

将文本与量角器中的换行符进行比较

如何在while循环期间运行“文件存在”函数(expect/tcl)作为条件?

httprunner 3.x学习16