你如何单元测试的飞镖异常?(How do you unittest exceptions in Da

2019-07-03 16:17发布

考虑到不基于传递的参数有些异常处理函数:

List range(start, stop) {
    if (start >= stop) {
      throw new ArgumentError("start must be less than stop");
    }
    // remainder of function
}

如何测试,正确类型的异常升高?

Answer 1:

在这种情况下,有各种方法来测试例外。 如果只是要测试的非特异性引发异常:

expect(() => range(5, 5), throwsException);

要测试异常的正确类型的提高:

有一般用途等几个预定义的匹配throwsArgumentErrorthrowsRangeErrorthrowsUnsupportedError等。可以为没有预先定义的匹配存在时,可以使用类型TypeMatcher<T>

expect(() => range(5, 2), throwsA(TypeMatcher<IndexError>()));

确保不发生异常:

expect(() => range(5, 10), returnsNormally);

测试异常类型和异常消息:

expect(() => range(5, 3), 
    throwsA(predicate((e) => e is ArgumentError && e.message == 'start must be less than stop')));

这里是另一种方式来做到这一点:

expect(() => range(5, 3), 
  throwsA(allOf(isArgumentError, predicate((e) => e.message == 'start must be less than stop'))));

(感谢格雷厄姆惠勒在谷歌的最后2个解决方案)。



Answer 2:

我喜欢这种方法:

test('when start > stop', () {
  try {
    range(5, 3);
  } on ArgumentError catch(e) {
    expect(e.message, 'start must be less than stop');
    return;
  }
  throw new ExpectException("Expected ArgumentError");  
});


Answer 3:

一个例外是使用检查throwsATypeMatcher

: isInstanceOf现在已经过时。

List range(start, stop) {
    if (start >= stop) {
      throw new ArgumentError("start must be less than stop");
    }
    // remainder of function
}


test("check argument error", () {
  expect(() => range(1, 2), throwsA(TypeMatcher<ArgumentError>()));
}); 


Answer 4:

对于简单的异常测试,我更喜欢用静态方法API:

Expect.throws(
  // test condition
  (){ 
    throw new Exception('code I expect to throw');
  },
  // exception object inspection
  (err) => err is Exception
);


文章来源: How do you unittest exceptions in Dart?
标签: dart