Flutter Unit Testing Cheatsheet
(c) Написано с использованием нейросетей ChatGPT 5
Минимальный набор вещей, которые стоит знать при написании unit-тестов во Flutter/Dart.
1. Основные пакеты
dart
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; // для моков2. Запуск unit-теста
dart
void main() {
test('description', () {
final result = someFunction();
expect(result, expectedValue);
});
}test()— базовая единица теста.expect(actual, matcher)— проверка результата.setUp()иtearDown()— выполняются до/после каждого теста.setUpAll()иtearDownAll()— выполняются один раз перед всеми тестами/после всех тестов.
3. Основные матчеры
expect(value, equals(5))— проверка равенства.expect(value, isNotNull)— проверка на null.expect(value, isTrue)/isFalse— булевые проверки.expect(() => throwError(), throwsException)— проверка выброса исключения.expect(list, contains(item))— проверка элементов в коллекции.expect(list, isEmpty)/isNotEmpty— проверка коллекций.
4. Организация тестов
dart
group('MyClass tests', () {
setUp(() {
// подготовка перед каждым тестом
});
test('should return correct value', () {
final result = MyClass().calculate();
expect(result, 42);
});
});group()— объединяет несколько тестов.- Можно вкладывать группы друг в друга для структурирования.
5. Моки и заглушки
Используем mocktail или mockito для зависимостей:
dart
class MockApi extends Mock implements ApiService {}
void main() {
late MockApi mockApi;
setUp(() {
mockApi = MockApi();
});
test('returns data from API', () async {
when(() => mockApi.fetchData()).thenAnswer((_) async => 'Hello');
final result = await mockApi.fetchData();
expect(result, 'Hello');
});
}when(...).thenReturn(...)— возвращает значение синхронно.when(...).thenAnswer(...)— возвращает Future/Stream.verify(() => mockApi.fetchData()).called(1)— проверка вызова метода.
6. Асинхронные тесты
dart
test('async test', () async {
final result = await asyncFunction();
expect(result, equals(42));
});- Всегда добавляй
asyncиawaitдля Future. - Можно использовать
expectLater(stream, emitsInOrder([...]))для Stream.
7. Исключения
dart
expect(() => functionThatThrows(), throwsA(isA<FormatException>()));throwsA(predicate)— проверка конкретного типа исключения.
8. Подготовка и очистка
dart
setUp(() {
// инициализация перед каждым тестом
});
tearDown(() {
// очистка после каждого теста
});setUpAll()/tearDownAll()— выполняются один раз на весь тестовый набор.
9. Полезные советы
- Разделяй тесты на маленькие, атомарные единицы.
- Мокай внешние зависимости (API, база данных, SharedPreferences и т.д.).
- Проверяй не только результат функции, но и побочные эффекты (например, вызовы методов на моках).
- Для сложных объектов используйте
equatableили собственные==иhashCode. - Старайся избегать
sleep()в тестах — используйте Future.delayed сpump/pumpAndSettleв widget-тестах, или имитацию времени в unit-тестах.