如何在Flutter驱动程序中测试ImagePicker?

时间:2019-06-13 21:05:46

标签: flutter-test

在Flutter集成测试中,我们如何处理ImagePicker?以及其他与平台相关的插件?

2 个答案:

答案 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();
}