如何测试Dart Record模式?eva函数匹配测试问题求助
Dart 元组测试断言问题解决建议
问题
我定义了返回元组的函数:
(int, double?) eva(String);
测试时可以直接匹配具体值,或者分开断言元组的两个元素:
expect(eva("something"), (4,10)); // 分开断言 expect(eva("something").$1, isNonZero); expect(eva("something").$2, 10);
但没法直接用混合具体值和匹配器的方式断言整个元组:
// 这种写法不生效 expect(eva("something"), (isNonZero,10) );
临时解决方案
把eva()的返回类型改成List,就能支持混合匹配器和具体值的断言写法:
expect(eva("something"), [isNonZero,10]);
无需修改原函数的方案
如果不想改动原函数的返回类型,可以自定义匹配器来支持元组的复合断言:
- 编写一个针对
(int, double?)类型的匹配器,分别校验两个元素 - 示例代码:
class TupleMatcher extends Matcher { final Matcher firstMatcher; final Matcher secondMatcher; TupleMatcher(this.firstMatcher, this.secondMatcher); @override bool matches(item, Map matchState) { if (item is (int, double?)) { return firstMatcher.matches(item.$1, matchState) && secondMatcher.matches(item.$2, matchState); } return false; } @override Description describe(Description description) { return description .add('元组需满足:第一个元素匹配 ') .addDescriptionOf(firstMatcher) .add(',第二个元素匹配 ') .addDescriptionOf(secondMatcher); } }
- 使用方式:
expect(eva("something"), TupleMatcher(isNonZero, equals(10)));
内容的提问来源于stack exchange,提问作者kantal
相关产品推荐
相关产品推荐

