如下所示的简单代码
expect(Right(['Two', 'Three']), equals(Right(['Two', 'Three'])));抛出错误:
ERROR: Expected: Right<dynamic, List>:<Right([Two, Three])>
Actual: Right<dynamic, List>:<Right([Two, Three])>我做错了什么?这两个列表是相同的,并且都有相等的元素。
发布于 2020-05-29 05:31:42
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有一个列表实现(immutable),它检查将会成功的深度相等,或者与如上所述的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'])));https://stackoverflow.com/questions/61817575
复制相似问题