You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:31:02