dart-generate-test-mocks
`package:mockito` と `build_runner` を使用して、外部依存関係のモックオブジェクトを定義・生成します。APIやデータベースなどの複雑な外部サービスに依存するクラスのユニットテストを行う際に使用してください。
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.
SKILL.md 本文
Dartアプリケーションのテストとモッキング
目次
テスト容易性のためのコード構造設計
Dartクラスを依存性注入をサポートするように設計します。複雑な外部依存関係(APIクライアントやデータベースなど)を分離して、テスト時にモックオブジェクトで置き換えられるようにします。
- 外部サービス(例:
http.Client)をクラスコンストラクタを通じて注入します。 - URLを
Uri.parse(string)を使用して厳密にUriオブジェクトで表現します。 - Dartのオブジェクト指向機能(クラス、ミックスイン)を活用して、外部との相互作用のための明確なインターフェースを定義します。
依存関係の管理
必要なテストおよびコード生成パッケージでpubspec.yamlファイルを構成します。
dart pub add httpを使用して実行時依存関係(例:package:http)を追加します。dart pub add dev:test dev:mockito dev:build_runnerを使用してテスト依存関係を追加します。- 名前空間の衝突を避けるために、HTTPライブラリをプレフィックス付きでインポートします:
import 'package:http/http.dart' as http;。
モックの生成
package:mockitoとbuild_runnerを使用して、固定されたシナリオと動作検証用のモッククラスを自動生成します。
- 常に
@GenerateNiceMocksアノテーション(@GenerateMocksよりも推奨。スタブ例外の欠落を回避)を使用します。 - アノテーションをテストファイルに配置し、
MockSpec<Type>()オブジェクトのリストを渡します。 .mocks.dart拡張子を使用して生成されたファイルをインポートします。build_runnerを実行してモックファイルを生成します:dart run build_runner build。
ユニットテストの実装
生成されたモックオブジェクトを使用してテスト対象のシステムを分離します。package:testを使用してテストスイートを構造化します。
- スタブ化: テスト対象システムとの相互作用前にモックの動作を設定します。
- 同期メソッドには
when(mock.method()).thenReturn(value)を使用します。 - 重要:
FutureまたはStreamを返すメソッドには、常にthenAnswer((_) async => value)を使用してください。非同期戻り値にはthenReturnを使用しないでください。
- 同期メソッドには
- 検証: テスト対象システムがモックオブジェクトと正しく相互作用したことを主張します。
verify(mock.method()).called(1)を使用して正確な呼び出し回数をチェックします。any、anyNamed、captureAnyなどの引数マッチャーを使用して柔軟な検証を行います。
ワークフロー: モックを使用したテストの作成と実行
モックされたユニットテストを実装および検証するには、以下のチェックリストを使用します。
タスク進捗
- 1. モック対象の外部依存関係を特定します(例:
http.Client)。 - 2. 依存関係をターゲットクラスのコンストラクタに注入します。
- 3. テストファイル(例:
target_test.dart)を作成し、`@GenerateNiceMocks([MockSpec<Dependency>()])を追加します。 - 4. 生成された
.mocks.dartファイルのpartまたはimportディレクティブを追加します。 - 5.
dart run build_runner buildを実行してモッククラスを生成します。 - 6.
group()とtest()を使用してテストケースを記述します。 - 7.
when()を使用して必要な動作をスタブ化します。 - 8. ターゲットメソッドを実行します。
- 9.
verify()を使用して相互作用を検証し、expect()を使用して結果を主張します。 - 10.
dart testを使用してテストスイートを実行します。
フィードバックループ: テスト失敗
テストが失敗するか、build_runnerがエラーを発生させた場合:
- バリデータを実行:
dart testまたはdart run build_runner buildを実行します。 - エラーを確認: 欠落しているスタブ、引数マッチャーの不一致、または生成されたファイルの構文エラーをチェックします。
- 修正:
- モックメソッドが予期しないnullエラーをスローする場合、
@GenerateNiceMocksを使用していることを確認します。 - 非同期スタブが
ArgumentErrorをスローする場合、thenReturnをthenAnswerに変更します。 build_runnerが失敗する場合、.mocks.dartのインポートがファイル名と正確に一致していることを確認します。
- モックメソッドが予期しないnullエラーをスローする場合、
- すべてのテストが成功するまで繰り返します。
例
高忠実度モッキングとテストの例
1. テスト対象システム (lib/api_service.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/api_service_test.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';
// 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: thenAnswerを使用して非同期HTTPリクエストをスタブ化
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');
// モックが正しい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,
);
});
});
}
ライセンス: BSD-3-Clause(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- dart-lang
- リポジトリ
- dart-lang/skills
- ライセンス
- BSD-3-Clause
- 最終更新
- 不明
Source: https://github.com/dart-lang/skills / ライセンス: BSD-3-Clause
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。