fail() 대신 throwsA 매처를 써요
fail() 대신 throwsA 매처를 써요
use_test_throws_matchers 규칙에 대해 알아볼게요.
본문
예외가 던져지는 걸 확인하는 테스트를 작성할 때, 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 챕터를 참고해 봐요.