person t-kobayashi

Flutter 2.5.0にアップデートした際に発生したエラー

calendar_today 2021年09月29日 update 2021年09月29日
Facebook Twitter LINE はてなブックマーク Pocket

今回のアップデートでもブレーキングチェンジにぶつかりました。今回はテスト実行時の仕様に関する変更のようです。表示されたエラーメッセージは以下の通りです。

The method 'setMockMethodCallHandler' isn't defined for the type 'MethodChannel'.
Try correcting the name to the name of an existing method, or defining a method named 'setMockMethodCallHandler'.

これはFlutterを2.5.0で、テストのパッケージがflutter_testに移行されたことが原因であると、以下のサイトに説明がありました。

https://flutter.dev/docs/release/breaking-changes/mock-platform-channels

応急処置

上記ページの移行ガイドの説明に従って、応急処置として、下記のコードをsetMockMethodCallHandlerを使っているファイルに追加してみます。

import 'package:flutter_test/flutter_test.dart';

するとエラーが解消されて動くようになりました。ただ、この解決方法はあくまで応急処置なので、将来的にサポートされなくなる可能性があるようです。移行ガイドには、いくつかのパターンが説明されているので、それに従ってコードを書き換えてみます。

推奨される修正パターン

以下は、公式サイトの移行ガイドで紹介されているサンプルコードの一部です。

// old code
myMethodChannel.setMockMethodCallHandler(...);
myMethodChannel.checkMockMethodCallHandler(...);
// new code
tester.binding.defaultBinaryMessenger.setMockMethodCallHandler(myMethodChannel, ...);
tester.binding.defaultBinaryMessenger.checkMockMessageHandler(myMethodChannel, ...);

私のテストコードでは、ヘルパーファイルに以下のようなメソッドを定義して、各testWidgetから呼び出してセットアップを完了しています。

import 'package:flutter_test/flutter_test.dart';

void packageInfoMock() {
  const MethodChannel('plugins.flutter.io/package_info')
      .setMockMethodCallHandler((MethodCall methodCall) async {
    if (methodCall.method == 'getAll') {
      return <String, dynamic>{
        'appName': 'appName',
        'packageName': 'package.name',
        'version': '1.0.0',
        'buildNumber': '1'
      };
    }
    return null;
  });
}

上記のコードを以下のように編集します。

import 'package:flutter_test/flutter_test.dart';

void packageInfoMock(WidgetTester tester) {
  tester.binding.defaultBinaryMessenger.setMockMethodCallHandler(
      MethodChannel('plugins.flutter.io/package_info'),
      (MethodCall methodCall) async {
    if (methodCall.method == 'getAll') {
      return <String, dynamic>{
        'appName': 'appName',
        'packageName': 'package.name',
        'version': '1.0.0',
        'buildNumber': '1'
      };
    }
    return null;
  });
}

各テストから呼び出す時に、WidgetTesterをパラメータとして渡す必要がありますが、上記の変更で古いコードを使わずにこれまで通りテストが成功するようになりました。

関連記事

Flutterの記事一覧を見る

Flutterの質問

soichiro1210 が1年前に投稿

質問日時 2023年07月31日

a-sato が3年前に投稿

質問日時 2021年07月01日

a-sato が3年前に投稿

質問日時 2021年06月30日

takumi が3年前に投稿

質問日時 2021年05月20日

a-sato が3年前に投稿

質問日時 2021年05月14日

Flutterの質問一覧を見る
search