Dart 单元测试给出不一致的结果

时间:2021-06-05 08:37:12

标签: unit-testing dart

我有一个相当简单的单元测试,它已经运行了很长时间没有问题。

它突然开始失败。

当我在 vscode 中运行/调试单元测试时,测试成功。

当我从 cli 运行测试时,它在 Windows 上成功,但在 linux 上不成功。

dart run test -j1 test/src/functions/ask_test.dart

这很有趣,因为没有特定于 windows/linux 的内容。 测试也在linux上运行了很长时间。


  test('ask.any - throws', () {
    final validator = Ask.any([
      Ask.fqdn,
      Ask.ipAddress(),
      Ask.inList(['localhost'])
    ]);

    expect(
        () => validator.validate('abc'),
        throwsA(predicate<AskValidatorException>((e) =>
            e is AskValidatorException && e.message == 'Invalid FQDN.')));
  });

测试给出以下错误:

Error: Expected: throws satisfies function
  Actual: <Closure: () => String>
   Which: threw AskValidatorException:<Invalid FQDN.>
          stack package:dcli/src/functions/ask.dart 760:7  _AskValidatorAny.validate
                test/src/functions/ask_test.dart 65:25     main.<fn>.<fn>
                package:test_api                           expect
                test/src/functions/ask_test.dart 64:5      main.<fn>

如您所见,validate 方法正在执行预期的操作(抛出)。 问题似乎是单元测试框架没有将其视为匹配项。

这是按预期抛出的验证器。


class _AskFQDN extends AskValidator {
  const _AskFQDN();
  @override
  String validate(String line) {
    final finalLine = line.trim().toLowerCase();

    if (!isFQDN(finalLine)) {
      throw AskValidatorException(red('Invalid FQDN.'));
    }
    return finalLine;
  }
}

我在 Dart 2.13 上使用测试 1.17.5。

代码来自 DCli 包,你可以在这里找到: https://github.com/bsutton/dcli

具体的单元测试在这里

https://github.com/bsutton/dcli/blob/master/test/src/functions/ask_test.dart

1 个答案:

答案 0 :(得分:0)

我不确定这会解决您的问题,但如果您这样做,您可以使您的断言更清晰:

expect(
    () => validator.validate('abc'),
    throwsA(isA<AskValidatorException>().having((e) =>
        e.message == 'Invalid FQDN.')));