我有一个相当简单的单元测试,它已经运行了很长时间没有问题。
它突然开始失败。
当我在 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
答案 0 :(得分:0)
我不确定这会解决您的问题,但如果您这样做,您可以使您的断言更清晰:
expect(
() => validator.validate('abc'),
throwsA(isA<AskValidatorException>().having((e) =>
e.message == 'Invalid FQDN.')));