fail() 대신 throwsA 매처를 써요

fail() 대신 throwsA 매처를 써요

use_test_throws_matchers 규칙에 대해 알아볼게요.

출처: Use throwsA matcher instead of fail().

본문

예외가 던져지는 걸 확인하는 테스트를 작성할 때, try-catch로 잡아서 fail()을 부르는 대신 throwsA 매처를 쓰는 게 훨씬 깔끔해요.

BAD:

// sync code
try {
  someSyncFunctionThatThrows();
  fail('expected Error');
} on Error catch (error) {
  expect(error.message, contains('some message'));
}

// async code
try {
  await someAsyncFunctionThatThrows();
  fail('expected Error');
} on Error catch (error) {
  expect(error.message, contains('some message'));
}

GOOD:

// sync code
expect(
  () => someSyncFunctionThatThrows(),
  throwsA(isA<Error>().having((Error error) => error.message, 'message', contains('some message'))),
);

// async code
await expectLater(
  () => someAsyncFunctionThatThrows(),
  throwsA(isA<Error>().having((Error error) => error.message, 'message', contains('some message'))),
);

throwsA 매처를 쓰면 “어떤 예외가 던져져야 한다”는 기대를 한 줄로 명확하게 표현할 수 있어요. 비동기 코드에선 expectLater와 함께 사용하면 돼요.

활성화

use_test_throws_matchers 규칙을 켜려면 analysis_options.yaml 파일의 linter > rules 아래에 추가해요:

linter:
  rules:
    - use_test_throws_matchers

YAML map 구문으로 lint 규칙을 설정하는 경우엔 linter > rules 아래에 use_test_throws_matchers: true를 넣으면 돼요:

linter:
  rules:
    use_test_throws_matchers: true

더 알아보기

  • throwsA 외에도 throwsStateError처럼 상황에 맞는 다양한 예외 매처가 있어요.
  • 테스트 작성 관련 지침은 Effective Dart의 Testing 챕터를 참고해 봐요.