mcpField
D
dart-add-unit-test

dart-add-unit-test

github.com/dhruvanbhalaraテスト・品質3052 回インストール9 週間前に更新
リポジトリ

dart-add-unit-test について

Dartのコマンドラインおよびバックエンドプロジェクト向けに、ユニットテスト、依存関係のモック、カバレッジ確認を案内するスキルです。`package:test`と`mocktail`を基本とし、テスト作成から実行・確認までの手順を示します。

主な機能

  1. 01`package:test`のユニットテスト規約
  2. 02Arrange-Act-Assertのテスト構成
  3. 03mocktailまたはmockitoによる依存のモック
  4. 04モックの呼び出し検証
  5. 05カバレッジ用コマンドと目標
  6. 06段階的なテスト実行チェックリスト

活用シーン

  1. 01Dartのビジネスロジックのテスト
  2. 02リポジトリ依存のモック
  3. 03メソッド呼び出しと順序の検証
  4. 04DartまたはFlutterのカバレッジ確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dhruvanbhalara/skills --skill dart-add-unit-test

インストール後、Claude Code で/dart-add-unit-testを入力して読み込まれたか確認します。

詳細

Dart テストスイート

目次

ユニットテスト

Dart の CLI およびバックエンドアプリケーションの標準テストライブラリとして package:test を活用します。

  • テストファイルは lib ディレクトリの構造を反映するように整理します。テストファイルには _test.dart を付けます。
  • 関連するテストは group() 関数を使ってグループ化します。
  • 共有のテスト状態には setUp() と tearDown() を使用します。
  • Domain/BLoC 内に純粋なロジックを記述し、静的で純粋な関数に抽出して 100% のユニットテストカバレッジを実現します。
  • テストグループ名には文字列補間を使用します: group('$ClassName', ...)
  • 各テストは Arrange-Act-Assert(Given-When-Then)の規約に従って構成します:
    • Arrange: モックを設定し、インスタンスを生成し、入力データを準備します。
    • Act: テスト対象のメソッドを呼び出します。
    • Assert: 出力または副作用を検証します。
  • テストを読みやすく保守しやすく保つため、セットアップと検証を分離します。

依存関係のモック

mocktail と mockito の選択
基準mocktail(推奨)mockito
コード生成不要build_runner が必要
セットアップ速度高速(Mock を継承)低速(アノテーション + コード生成)
Null 安全完全サポート完全サポート
API スタイルwhen(() => mock.method())when(mock.method())
最適な用途ほとんどのプロジェクト、高速なイテレーション複雑な API を持つ大規模プロジェクト

ルール: デフォルトでは mocktail を使用します(コード生成不要でセットアップが高速)。多くのオーバーロードを持つ複雑な API のために @GenerateNiceMocks が必要な場合にのみ mockito を使用します。

mocktail のセットアップ(推奨)
import 'package:mocktail/mocktail.dart';

// Create mock: no code generation needed
class MockUserRepository extends Mock implements UserRepository {}

void main() {
  late MockUserRepository mockRepo;

  setUp(() {
    mockRepo = MockUserRepository();
  });

  test('fetches user successfully', () {
    // Arrange
    when(() => mockRepo.getUser('1'))
        .thenAnswer((_) async => const User(id: '1', name: 'Alice'));

    // Act
    final user = await mockRepo.getUser('1');

    // Assert
    expect(user.name, 'Alice');
    verify(() => mockRepo.getUser('1')).called(1);
  });
}
mockito のセットアップ(コード生成)
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';

@GenerateNiceMocks([MockSpec<UserRepository>()])
import 'user_test.mocks.dart';  // Generated by: dart run build_runner build
検証 API
API目的
verify(() => mock.method()).called(1)メソッドが正確に 1 回呼び出されたことを検証する
verifyNever(() => mock.method())メソッドが呼び出されなかったことを検証する
verifyNoMoreInteractions(mock)未検証のインタラクションが残っていないことを検証する
verifyInOrder([...])メソッドが特定の順序で呼び出されたことを検証する
reset(mock)すべてのスタブとインタラクションをクリアする
フォールバック値の登録

パラメータとしてカスタム型を持つメソッドの場合:

setUpAll(() {
  registerFallbackValue(const User(id: '0', name: 'fallback'));
});

テストカバレッジ

  • ドメインモデルとビジネスロジックについては 100% のロジックカバレッジを目標とします。
  • dart test --coverage=coverage または flutter test --coverage でカバレッジを実行します。
  • LCOV/HTML レポート生成の詳細については dart-coverage スキルを参照してください。

ワークフロー: テストの実行

Dart の機能をテストする際は、この順序に従ったワークフローに沿って進めてください。進捗を追跡するにはチェックリストをコピーしてください。

タスクの進捗
  • ステップ 1: ユニットテストを書く。 中核となるビジネスロジックに集中します。ファイル名が _test.dart で終わることを確認します。
  • ステップ 2: モックを生成する。 Mockito を使用している場合は、dart run build_runner build を実行してモックを生成します。
  • ステップ 3: テストを実行する。 dart test を実行します。
  • ステップ 4: カバレッジを確認する。 dart test --coverage=coverage を実行し、カバレッジの目標が達成されていることを確認します。

コメント