今回のアップデートでもブレーキングチェンジにぶつかりました。今回はテスト実行時の仕様に関する変更のようです。表示されたエラーメッセージは以下の通りです。
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
をパラメータとして渡す必要がありますが、上記の変更で古いコードを使わずにこれまで通りテストが成功するようになりました。