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-тестах.