dart

How do you unittest exceptions in Dart?


Consider a function that does some exception handling based on the arguments passed:

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

How do I test that the right kind of exception is raised?


Solution

  • In this case, there are various ways to test the exception. To simply test that an unspecific exception is raised:

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

    to test that the right type of exception is raised:

    there are several predefined matchers for general purposes like throwsArgumentError, throwsRangeError, throwsUnsupportedError, etc.. for types for which no predefined matcher exists, you can use TypeMatcher<T>.

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

    to ensure that no exception is raised:

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

    to test the exception type and exception message:

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

    here is another way to do this:

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

    (Thanks to Graham Wheeler at Google for the last 2 solutions).