К основному содержанию
скилл Claude Code CX Codex Cursor GitHub Copilot

dart-generate-test-mocks — скилл для Claude Code: как ставить

Скилл для юнит-тестов на Dart: агент выносит внешние зависимости в конструктор, генерирует моки через mockito и build_runner, потом пишет тесты.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add dart-lang/skills --skill dart-generate-test-mocks -a claude-code
Открыть на GitHub

Что делает dart-generate-test-mocks

Скилл учит агента писать юнит-тесты на Dart с моками внешних зависимостей. Сначала код приводится в вид, пригодный для подмены: http.Client и похожие сервисы внедряются через конструктор, адреса передаются как Uri. Потом в проект добавляются пакеты командой dart pub add dev:test dev:mockito dev:build_runner.

Дальше в тестовом файле появляется аннотация @GenerateNiceMocks([MockSpec<http.Client>()]) и импорт сгенерированного .mocks.dart, а dart run build_runner build создаёт сами классы. Заглушки для методов, возвращающих Future или Stream, скилл велит писать через thenAnswer, а не thenReturn. На @GenerateMocks он не опирается: берёт @GenerateNiceMocks, потому что иначе незаглушенный метод бросает исключение.

Внутри есть чек-лист из десяти шагов и разбор типовых падений: ArgumentError в асинхронной заглушке, расхождение имени импорта с файлом .mocks.dart, ошибки сборки. Нужен Dart SDK и пакеты из pub — без build_runner мок-классы не появятся, и тест просто не скомпилируется.

Какие задачи решает

  • Замокать http.Client в тесте сервиса
  • Сгенерировать мок-классы через build_runner
  • Настроить заглушку для метода, возвращающего Future
  • Проверить, что метод мока вызван ровно один раз
  • Разобраться, почему тест падает с ArgumentError

Примеры запросов агенту

  • Сгенерируй моки для `ApiService` через `@GenerateNiceMocks` и `dart run build_runner build`
  • Напиши юнит-тест на `fetchData`: замокай `http.Client` и проверь вызов через `verify`
  • Тест падает с `ArgumentError` — перепиши асинхронную заглушку на `thenAnswer`

Как установить dart-generate-test-mocks

1Через Skills CLI (Vercel)

npx skills add dart-lang/skills --skill dart-generate-test-mocks -a claude-code

2Вручную: положить файлы

~/.claude/skills/dart-generate-test-mocks/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/dart-generate-test-mocks/

Из того же набора7

Весь набор →
dart-add-unit-test dart-lang Пишет unit-тесты на Dart и Flutter через package:test: раскладывает файлы по test/, добавляет моки и гоняет прогон до зелёного. Claude Code CX Codex Cursor +1 19 100установок dart-run-static-analysis dart-lang Запускает dart analyze для поиска ошибок и dart fix --apply для автоисправления предупреждений линтера. Помогает проверять качество кода на Dart перед коммитами. Claude Code CX Codex Cursor +1 19 000установок dart-use-pattern-matching dart-lang Скилл задаёт агенту правила работы с паттернами Dart 3: switch-выражения, деструктуризация JSON, sealed-классы, сегменты пути. Claude Code CX Codex Cursor +1 18 700установок dart-resolve-package-conflicts dart-lang Скилл для решения конфликтов версий пакетов в Dart-проектах, когда pub get не может найти совместимые версии. Помогает разобраться с lockfile и обновить зависимости без полного пересчёта. Claude Code CX Codex Cursor +1 18 600установок dart-build-cli-app dart-lang Скилл для разработки command-line приложений на Dart. Даёт паттерны архитектуры, структуру точки входа, коды выхода, маршрутизацию потоков и запуск подпроцессов. Claude Code CX Codex Cursor +1 18 000установок dart-migrate-to-checks-package dart-lang Переводит тесты Dart с устаревшего пакета package:matcher на package:checks. Пригодится для перехода на строгую типизацию утверждений и улучшение диагностики ошибок. Claude Code CX Codex Cursor +1 18 000установок

Похожие

write-e2e-tests tldraw Помогает писать Playwright E2E-тесты для tldraw: действия в интерфейсе, меню и фигуры на холсте. Нужен при добавлении тестов в примеры SDK или клиент tldraw.com. Claude Code CX Codex Cursor +1 430установок phoenix-evals официальный [email protected] Скилл помогает создавать и запускать оценщики для AI- и LLM-приложений с Phoenix. Пригодится для разбора ошибок, проверки RAG и оценки качества моделей. GitHub Copilot 1 000установок phoenix-cli официальный arize-ai Скилл для GitHub Copilot, который через Phoenix CLI достаёт трейсы, спаны и сессии, помогает найти причины сбоев LLM-приложений и собрать таксономию ошибок. GitHub Copilot 1 000установок quantized-export Seth Hobson Скилл экспортирует одобренные чекпойнты и LoRA-адаптеры в FP8, AWQ, GGUF или merged safetensors. Нужен перед развёртыванием модели. Claude Code CX Codex Cursor 2 600установок eval-harness-first Seth Hobson Собирает оценочный контур до начала fine-tuning: goldens, graders, калибровку judge и baseline базовой модели. Нужен для контроля регрессий. Claude Code CX Codex Cursor 2 600установок checkpoint-promotion Seth Hobson Проверяет обученный чекпойнт перед выпуском: ищет утечки, дрейф возможностей, забывание и провал в сравнении с базовой моделью. Claude Code CX Codex Cursor 2 600установок improve-codebase-architecture Matt Pocock Скилл ищет архитектурные узкие места в кодовой базе и показывает варианты углубления модулей в HTML-отчёте. Подойдёт для ревью перед рефакторингом. Claude Code 1 163 035установок design-taste-frontend Leonxlnx Скилл задаёт арт-дирекцию для публичных страниц и рабочих экранов, а затем проверяет результат в браузере по скриншотам. Нужен, когда интерфейс выглядит шаблонным или недоработанным. Claude Code CX Codex Cursor +1 673 100установок

Вопросы о dart-generate-test-mocks

Как установить dart-generate-test-mocks в Claude Code?

Одной командой: npx skills add dart-lang/skills --skill dart-generate-test-mocks -a claude-code. Файл скилла окажется в ~/.claude/skills/dart-generate-test-mocks/SKILL.md.

Что делает dart-generate-test-mocks?

Проводит агента по всей цепочке: подготовить класс к внедрению зависимостей, добавить пакеты для тестов, сгенерировать моки и написать тест с заглушками и проверкой вызовов.

Чем `@GenerateNiceMocks` отличается от `@GenerateMocks`?

Nice-моки возвращают пустые значения вместо исключения, когда метод не заглушен. Скилл поэтому выбирает их: меньше неожиданных падений в тесте.

Исходный текст

SKILL.md · BSD-3-Clause
---
name: dart-generate-test-mocks
description: Define and generate mock objects for external dependencies using `package:mockito` and `build_runner`. Use when unit testing classes that depend on complex external services like APIs or databases.
metadata:
  model: models/gemini-3.1-pro-preview
  last_modified: Fri, 24 Apr 2026 15:13:58 GMT
---
# Testing and Mocking Dart Applications

## Contents
- [Structuring Code for Testability](#structuring-code-for-testability)
- [Managing Dependencies](#managing-dependencies)
- [Generating Mocks](#generating-mocks)
- [Implementing Unit Tests](#implementing-unit-tests)
- [Workflow: Creating and Running Mocked Tests](#workflow-creating-and-running-mocked-tests)
- [Examples](#examples)

## Structuring Code for Testability
Design Dart classes to support dependency injection. Isolate complex external dependencies (like API clients or databases) so they can be replaced with mock objects during testing.

- Inject external services (e.g., `http.Client`) through class constructors.
- Represent URLs strictly as `Uri` objects using `Uri.parse(string)`.
- Utilize Dart's object-oriented features (classes, mixins) to define clear interfaces for external interactions.

## Managing Dependencies
Configure the `pubspec.yaml` file with the necessary testing and code generation packages.

- Add runtime dependencies (e.g., `package:http`) using `dart pub add http`.
- Add testing dependencies using `dart pub add dev:test dev:mockito dev:build_runner`.
- Import HTTP libraries with a prefix to avoid namespace collisions: `import 'package:http/http.dart' as http;`.

## Generating Mocks
Use `package:mockito` and `build_runner` to automatically generate mock classes for fixed scenarios and behavior verification.

- Always use the `@GenerateNiceMocks` annotation (preferable to `@GenerateMocks` to avoid missing stub exceptions).
- Place the annotation in the test file, passing a list of `MockSpec<Type>()` objects.
- Import the generated file using the `.mocks.dart` extension.
- Execute `build_runner` to generate the mock files: `dart run build_runner build`.

## Implementing Unit Tests
Isolate the system under test using the generated mock objects. Use `package:test` to structure the test suite.

- **Stubbing:** Configure mock behavior before interacting with the system under test.
  - Use `when(mock.method()).thenReturn(value)` for synchronous methods.
  - **CRITICAL:** Always use `thenAnswer((_) async => value)` for methods returning a `Future` or `Stream`. Never use `thenReturn` for asynchronous returns.
- **Verification:** Assert that the system under test interacted with the mock object correctly.
  - Use `verify(mock.method()).called(1)` to check exact invocation counts.
  - Use argument matchers like `any`, `anyNamed`, or `captureAny` for flexible verification.

## Workflow: Creating and Running Mocked Tests

Use the following checklist to implement and verify mocked unit tests.

### Task Progress
- [ ] 1. Identify the external dependency to mock (e.g., `http.Client`).
- [ ] 2. Inject the dependency into the target class constructor.
- [ ] 3. Create a test file (e.g., `target_test.dart`) and add `@GenerateNiceMocks([MockSpec<Dependency>()])`.
- [ ] 4. Add the `part` or `import` directive for the generated `.mocks.dart` file.
- [ ] 5. Run `dart run build_runner build` to generate the mock classes.
- [ ] 6. Write the test cases using `group()` and `test()`.
- [ ] 7. Stub required behaviors using `when()`.
- [ ] 8. Execute the target method.
- [ ] 9. Verify interactions using `verify()` and assert outcomes using `expect()`.
- [ ] 10. Run the test suite using `dart test`.

### Feedback Loop: Test Failures
If tests fail or `build_runner` encounters errors:
1. **Run validator:** Execute `dart test` or `dart run build_runner build`.
2. **Review errors:** Check for missing stubs, mismatched argument matchers, or syntax errors in the generated files.
3. **Fix:**
   - If a mock method throws an unexpected null error, ensure you used `@GenerateNiceMocks`.
   - If an async stub throws an `ArgumentError`, change `thenReturn` to `thenAnswer`.
   - If `build_runner` fails, ensure the `.mocks.dart` import matches the file name exactly.
4. Repeat until all tests pass.

## Examples

### High-Fidelity Mocking and Testing Example

**1. System Under Test (`lib/api_service.dart`)**
```dart
import 'dart:convert';
import 'package:http/http.dart' as http;

class ApiService {
  final http.Client client;

  ApiService(this.client);

  Future<String> fetchData(String urlString) async {
    final uri = Uri.parse(urlString);
    final response = await client.get(uri);

    if (response.statusCode == 200) {
      return jsonDecode(response.body)['data'];
    } else {
      throw Exception('Failed to load data');
    }
  }
}
```

**2. Test Implementation (`test/api_service_test.dart`)**
```dart
import 'package:test/test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:http/http.dart' as http;
import 'package:my_app/api_service.dart';

// Generate the mock class for http.Client
@GenerateNiceMocks([MockSpec<http.Client>()])
import 'api_service_test.mocks.dart';

void main() {
  group('ApiService', () {
    late ApiService apiService;
    late MockClient mockHttpClient;

    setUp(() {
      mockHttpClient = MockClient();
      apiService = ApiService(mockHttpClient);
    });

    test('returns data if the http call completes successfully', () async {
      // Arrange: Stub the async HTTP GET request using thenAnswer
      when(mockHttpClient.get(any)).thenAnswer(
        (_) async => http.Response('{"data": "Success"}', 200),
      );

      // Act
      final result = await apiService.fetchData('https://api.example.com/data');

      // Assert
      expect(result, 'Success');

      // Verify the mock was called with the correct Uri
      verify(mockHttpClient.get(Uri.parse('https://api.example.com/data'))).called(1);
    });

    test('throws an exception if the http call completes with an error', () {
      // Arrange
      when(mockHttpClient.get(any)).thenAnswer(
        (_) async => http.Response('Not Found', 404),
      );

      // Act & Assert
      expect(
        apiService.fetchData('https://api.example.com/data'),
        throwsException,
      );
    });
  });
}
```

© dart-lang · BSD-3-Clause · dart-lang/skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой