在Flutter集成测试中,我们如何处理ImagePicker?以及其他与平台相关的插件?
答案 0 :(得分:2)
Frank Yan 的解决方案工作正常。基本上他使用 MethodChannel 作为对 ImagePicker 的请求的拦截器
MethodChannel('plugins.flutter.io/image_picker')
在这部分中,他定义了必须模拟哪个插件
channel.setMockMethodCallHandler((MethodCall methodCall) async {
ByteData data = await rootBundle.load('images/sample.png');
Uint8List bytes = data.buffer.asUint8List();
Directory tempDir = await getTemporaryDirectory();
File file = await File('${tempDir.path}/tmp.tmp', ).writeAsBytes(bytes);
print(file.path);
return file.path;
});
这个函数定义了从请求到图像选择器插件必须返回的内容。因此,每次用户使用图像选择器时,您的程序都会执行这些操作。在这里,它只会从“images/sample.png”返回图像。就我而言,我必须将图像放入项目根目录中的 assets/image.png 中。无论如何,您可以模拟任何这样的插件。我还必须模拟裁剪器插件,该插件在图像选择器结束工作后调用。
**注意:**mocking 不是 e2e 的最佳方式,也不是 Flutter 集成测试中调用的方式。我使用它只是因为目前没有解决方法(我找不到它)并且我在我的场景中被图片上传步骤阻止。所以使用这种方法时要小心。
你不需要在测试中的任何地方调用这个函数。您的应用程序将使用我们在 MethodChannel 构造函数 MethodChannel(''); 中定义的模拟插件运行;
答案 1 :(得分:0)
最后,我为这个问题找到了解决方案。 这是app.dart中的代码:
准备资产中的图像文件,例如:images / sample.png。
import 'dart:io';
import 'dart:typed_data';
import 'package:path_provider/path_provider.dart';
import 'package:image_picker_test/main.dart' as app;
import 'package:flutter_driver/driver_extension.dart';
import 'package:flutter/services.dart';
void main() {
// This line enables the extension.
enableFlutterDriverExtension();
const MethodChannel channel =
MethodChannel('plugins.flutter.io/image_picker');
channel.setMockMethodCallHandler((MethodCall methodCall) async {
ByteData data = await rootBundle.load('images/sample.png');
Uint8List bytes = data.buffer.asUint8List();
Directory tempDir = await getTemporaryDirectory();
File file = await File('${tempDir.path}/tmp.tmp', ).writeAsBytes(bytes);
print(file.path);
return file.path;
});
app.main();
}