2012-11-08 31 views
10

考虑,做基础上,论证了一些异常处理函数传递参数:你如何在Dart中单元测试异常?

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

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

回答

23

在这种情况下,有各种方法来测试异常。为了简单的测试将引发异常:

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

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

expect(() => range(5, 2), throwsA(new isInstanceOf<ArgumentError>())); 

,以确保不发生异常:

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个解决方案)。

+0

我是做'希望(范围(5,3),throwsArgumentError )',但这个例外在预期内并没有被捕获。期望的第一个参数必须是一个匿名函数,当被调用时它最终会抛出。你的回答帮助我找到了那个愚蠢的错误,谢谢! – fgiraldeau

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"); 
}); 
+0

这是比其他选项更详细一些,但它是相当可读的,它并不假定你已经记住了整个单元测试库;) –

1

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

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