رفتن به محتوا

آزمایش کردن (Testing)

Bloc به گونه ای طراحی شده است که آزمایش آن بسیار آسان باشد.در این بخش، نحوه تست واحد (Unit Test) یک بلوک را توضیح خواهیم داد.

به خاطر سادگی، بیایید تست ها را برای 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));
}
}

راه اندازی (Setup)

قبل از شروع نوشتن تست های خود، باید یک چارچوب آزمایشی (Testing Framework) را به وابستگی های خود اضافه کنیم.

ما باید test و bloc_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 مراجعه کنید تا یک مثال از یک برنامه کاملاً تست شده را ببینید.