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

Dart单元测试结果不一致:VSCode/Windows正常Linux CLI执行失败

问题根因

你代码中抛出AskValidatorException时传入的消息经过了red()方法处理,该方法用于给终端输出添加红色ANSI转义序列:

  • VSCode调试环境、Windows CLI默认关闭ANSI颜色支持,此时red('Invalid FQDN.')返回的就是纯文本Invalid FQDN.,和测试断言中的字符串匹配,所以测试通过。
  • Linux CLI默认开启ANSI颜色支持,red()会在文本前后插入颜色控制转义符,实际返回值为\x1B[31mInvalid FQDN.\x1B[0m这类带特殊控制字符的字符串,和断言中的纯文本不匹配,导致测试失败。

修复方案

你可以任选以下一种方案修复:

  • 方案一:调整异常设计,在AskValidatorException中单独存储原始纯文本消息,red()仅作用于终端输出场景,测试断言直接匹配原始纯文本消息即可,从根源避免跨环境差异。
  • 方案二:修改断言逻辑,判断异常类型的同时,先剥离消息中的ANSI转义序列再做匹配,示例如下:
// 先定义ANSI转义序列匹配正则
final _ansiEscapeRegex = RegExp(r'\x1B(?:[@-Z\\-_]|\[.*?[ -/]*[@-~])');
// 调整断言
expect(
    () => validator.validate('abc'),
    throwsA(predicate<AskValidatorException>((e) =>
        e is AskValidatorException && 
        _ansiEscapeRegex.replaceAll(e.message, '') == 'Invalid FQDN.')));
  • 方案三:执行测试时强制关闭颜色输出,Linux环境下执行测试命令前添加环境变量FORCE_COLOR=0即可,命令示例:FORCE_COLOR=0 dart run test -j1 test/src/functions/ask_test.dart

内容的提问来源于stack exchange,提问作者Brett Sutton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 02:36:03