Flutter テストのプラグイン
ほとんど全て flutterプラグイン2 つの部分があります。
- Dart コード。コードが呼び出す API を提供します。
- プラットフォーム固有 (または「ホスト」) 言語で書かれたコード、 これらの API を実装する Kotlin や Swift など。
実際、ネイティブ (またはホスト) 言語コードは次のように区別します。 標準パッケージからのプラグイン パッケージ。
プラグインのホスト部分の構築と登録
Flutter アプリケーションのビルド プロセスの一部です。
したがって、プラグインはコードの実行中にのみ機能します
アプリケーション内で、などflutter run
または走っているとき統合テスト。
走行時Dart 単体テストまたウィジェットのテスト、ホストコードは利用できません。
テストしているコードがプラグインを呼び出している場合、
これにより、多くの場合、次のようなエラーが発生します。
MissingPluginException(No implementation found for method someMethodName on channel some_channel_name)
プラグインを使用するコードの単体テストを行う場合、 この例外を回避するにはいくつかのオプションがあります。 次のソリューションは優先順にリストされています。
プラグインをラップする
ほとんどの場合、最良のアプローチはプラグインをラップすることです 独自の API を呼び出します。 そしてその方法を提供する嘲笑するテストでの独自の API。
これにはいくつかの利点があります。
- プラグイン API が変更された場合、 テストを更新する必要はありません。
- 自分のコードをテストしているだけです。 の動作が原因でテストが失敗することはありません 使用しているプラグイン。
- 関係なく同じアプローチを使用できます プラグインがどのように実装されるか、 または、プラグイン以外のパッケージの依存関係についても同様です。
プラグインのパブリック API をモックする
プラグインの API がすでにクラス インスタンスに基づいている場合、 次の点に注意して、直接モックすることもできます。
- プラグインが使用している場合、これは機能しません 非クラス関数または静的メソッド。
- 次の場合にテストを更新する必要があります プラグイン API が変更されます。
プラグインのプラットフォーム インターフェイスをモックする
プラグインがフェデレーションプラグイン、 これには、次のことを可能にするプラットフォーム インターフェイスが含まれます。 内部ロジックの実装を登録します。 そのプラットフォームインターフェイスのモックを登録できます パブリック API の代わりに、 次の注意事項:
- プラグインがフェデレーションされていない場合、これは機能しません。
- テストにはプラグインのコードの一部が含まれます。 そのため、プラグインの動作がテストに問題を引き起こす可能性があります。 たとえば、プラグインがファイルの一部としてファイルを書き込む場合、 内部キャッシュにより、テストの動作が変わる可能性があります 以前にテストを実行したかどうかに基づいて。
- プラットフォーム インターフェイスが変更されると、テストの更新が必要になる場合があります。
これが必要となる場合の例は、次のとおりです。 によって使用されるプラグインの実装をモックする 信頼できるパッケージ、 自分で作ったコードではなく、 したがって、呼び方を変更することはできません。 ただし、可能であれば、 代わりに、プラグインを使用する依存関係をモックする必要があります。
プラットフォームチャネルをモックする
プラグインが使用する場合プラットフォームチャネル、
を使用してプラットフォームチャネルをモックできますTestDefaultBinaryMessenger
。
これは、何らかの理由で次のような場合にのみ使用してください。
上記の方法はどれも利用できませんが、
いくつかの欠点があるためです。
- プラットフォームチャネルを使用する実装のみ 嘲笑できる。これは、いくつかの実装が プラットフォームチャネルを使用しないでください。 テストで予期せず使用される 一部のプラットフォームで実行される場合の実際の実装。
- プラットフォーム チャネルは通常、内部実装です プラグインの詳細。 たとえ大幅に変わる可能性もあります プラグインのバグ修正アップデートで、 予期せずテストを中断してしまう可能性があります。
- プラットフォーム チャネルは実装ごとに異なる場合があります フェデレーションプラグインの。例えば、 模擬プラットフォーム チャネルをセットアップして、 Windows マシンでテストをパスさせる、 その後、macOS または Linux で実行すると失敗することがわかりました。
- プラットフォーム チャネルは厳密に型指定されていません。 たとえば、メソッド チャネルでは辞書がよく使用されます。 プラグインの実装を読む必要があります キー文字列と値の型が何であるかを知るため。
こうした制限があるため、TestDefaultBinaryMessenger
主に内部テストで役立ちます
プラグイン実装の、
プラグインを使用したコードのテストではなく。
こちらもチェックしてみてはいかがでしょうかプラグインのテスト。