컨텐츠로 건너뛰기

테스팅

Bloc은 테스트하기가 매우 쉽도록 설계되었습니다. 이 섹션에서는 bloc을 unit test 하는 방법을 살펴보겠습니다.

단순화를 위해, Core Concepts에서 만든 CounterBloc에 대한 테스트를 작성해보겠습니다.

복습을 위해 요약하면, CounterBloc 구현은 다음과 같습니다:

counter_bloc.dart
sealed class CounterEvent {}
final class CounterIncrementPressed extends CounterEvent {}
final class CounterDecrementPressed extends CounterEvent {}
class CounterBloc extends Bloc<CounterEvent, int> {
CounterBloc() : super(0) {
on<CounterIncrementPressed>((event, emit) => emit(state + 1));
on<CounterDecrementPressed>((event, emit) => emit(state - 1));
}
}

준비

테스트 작성을 시작하기 전에 종속성에 테스트 프레임워크를 추가해야 합니다.

프로젝트에 testbloc_test를 추가합니다.

Terminal window
dart pub add dev:test dev:bloc_test

테스팅

CounterBloc 테스트용 파일인 counter_bloc_test.dart를 만들고 테스트 패키지를 가져오는 것부터 시작해 보겠습니다.

counter_bloc_test.dart
import 'package:test/test.dart';
import 'package:bloc_test/bloc_test.dart';

다음으로, main와 테스트 그룹을 만들어야 합니다.

counter_bloc_test.dart
void main() {
group(CounterBloc, () {
});
}

모든 테스트에서 사용될 CounterBloc의 인스턴스를 생성하는 것부터 시작해 보겠습니다.

counter_bloc_test.dart
group(CounterBloc, () {
late CounterBloc counterBloc;
setUp(() {
counterBloc = CounterBloc();
});
});

이제 개별 테스트 작성을 시작하겠습니다.

counter_bloc_test.dart
group(CounterBloc, () {
late CounterBloc counterBloc;
setUp(() {
counterBloc = CounterBloc();
});
test('initial state is 0', () {
expect(counterBloc.state, equals(0));
});
});

이 시점에서 우리는 첫 번째 통과된 테스트를 받아야 합니다! 이제 bloc_test 패키지를 사용하여 좀 더 복잡한 테스트를 작성해 보겠습니다.

counter_bloc_test.dart
blocTest(
'emits [1] when CounterIncrementPressed is added',
build: () => counterBloc,
act: (bloc) => bloc.add(CounterIncrementPressed()),
expect: () => [1],
);
blocTest(
'emits [-1] when CounterDecrementPressed is added',
build: () => counterBloc,
act: (bloc) => bloc.add(CounterDecrementPressed()),
expect: () => [-1],
);

이제 우리는 테스트를 실행하고 모든 테스트가 통과되는지 확인할 수 있어야 합니다.

이게 전부입니다. 테스트는 쉬워야 하며 코드를 변경하고 리펙토링할 때 자신감을 가질 수 있어야 합니다.

완전히 테스트된 애플리케이션의 예제는 Weather App을 참조 바랍니다.