How to Test Functions that Throw in Flutter

When writing test expectations for functions that throw, we need a bit careful.

For example, consider this simple test:

test('function throws', () {
  expect(
    someFunctionThatThrows(),
    throwsStateError,
  );
});

In this case, the test will fail, because someFunctionThatThrows() is evaluated before the expect function is called.

This is equivalent to writing the test like this:

test('function throws', () {
  // if the function throws, the test will fail immediately
  final result = someFunctionThatThrows();
  // and this line will never be exectuted
  expect(
    result,
    throwsStateError,
  );
});

To fix this, we can pass an anonymous function as an argument to the expect method:

test('function throws', () {
  expect(
    // function argument, will be evaluated *inside* the expect function
    () => someFunctionThatThrows(),
    throwsStateError,
  );
});

Or even better, we can use a tear-off and pass someFunctionThatThrows directly as an argument (without calling it):

test('function throws', () {
  expect(
    someFunctionThatThrows,
    throwsStateError,
  );
});

This is safer, and more concise too! 👌

For more info about tear-offs, see this rule about effective Dart usage.

Happy coding!

Want More?

Invest in yourself with my high-quality Flutter courses.

Flutter in Production

Flutter in Production

Learn about flavors, environments, error monitoring, analytics, release management, CI/CD, and finally ship your Flutter apps to the stores. 🚀

Flutter Foundations Course

Flutter Foundations Course

Learn about State Management, App Architecture, Navigation, Testing, and much more by building a Flutter eCommerce app on iOS, Android, and web.

Flutter & Firebase Masterclass

Flutter & Firebase Masterclass

Learn about Firebase Auth, Cloud Firestore, Cloud Functions, Stripe payments, and much more by building a full-stack eCommerce app with Flutter & Firebase.

The Complete Dart Developer Guide

The Complete Dart Developer Guide

Learn Dart Programming in depth. Includes: basic to advanced topics, exercises, and projects. Last updated to Dart 2.15.

Flutter Animations Masterclass

Flutter Animations Masterclass

Master Flutter animations and build a completely custom habit tracking application.