0

我正在尝试通过此链接对 image_picker 进行 e2e 测试的解决方案如何在 Flutter Driver 中测试 ImagePicker?

 void main() {
      enableFlutterDriverExtension();
    
      const MethodChannel channel =
          MethodChannel('plugins.flutter.io/image_picker');
    
      setUp(() {
        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();
    }

我的主要测试文件是完全一样的。问题是,当我enableFlutterDriverExtension(); 在开始后立即使用测试时,完成了所有测试通过的信息,没有在模拟器上模拟步骤,并在每一步后将所有信息打印到控制台。在控制台中我得到

[VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: 'package:flutter_driver/src/extension/extension.dart': Failed assertion: line 222 pos 10:
'WidgetsBinding.instance == null': is not true.
#0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:47:61)
#1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:36:5)
#2      enableFlutterDriverExtension (package:flutter_driver/src/extension/extension.dart:222:10)
#3      main 

没有 enableFlutterDriverExtension(); 当我尝试调用 image_picker 时测试失败。有错误

flutter:   'package:flutter_test/src/binding.dart': Failed assertion: line 775 pos 14: '_pendingExceptionDetails != null': A test overrode FlutterError.onError
but either failed to return it to its original state, or had unexpected additional errors that it could not handle. Typically, this is caused by using expect()
before restoring FlutterError.onError.
flutter:   dart:core-patch/errors_patch.dart 47:61       _AssertionError._doThrowNew

enableFlutterDriverExtension() 究竟是什么?做?没有测试 image_picker 并且这个 enableFlutterDriverExtension() 测试工作正常。还有其他测试 image_picker 的解决方案吗?

4

1 回答 1

0

问题如何在 Flutter Driver 中测试 ImagePicker?已经超过 2 岁了,所以它不是更实际。


在你测试它之前,你需要为一个平台实现它。您可以像这样为 android 实现它:从 0.8.1 版开始,Android 实现支持在 Android 4.3 或更高版本上选择(多个)图像。

无需配置 - 插件应该开箱即用。然而,强烈建议在内存不足时为 Android 杀死应用程序做准备。在 Android 上处理 MainActivity 销毁部分讨论了如何为此做准备。

不再需要将 android:requestLegacyExternalStorage="true" 作为属性添加到 AndroidManifest.xml 中的标签,因为 image_picker 已更新为使用范围存储。

注意:使用相机拍摄的图像和视频会保存到应用程序的本地缓存中,因此应该只是暂时存在。如果您需要永久存储您挑选的图像,您有责任将其移动到更永久的位置。


然后您可以通过执行以下操作检查它是否有效来测试它:

// it pick a image from gallery but you can change that to camera
final XFile? image = await _picker.pickImage(source: ImageSource.gallery);

您需要知道它为您提供了 XFile 而不是普通文件,但您可以将其转换为如下文件:

final xFile = await ImagePicker().pickImage(source: ImageSource.gallery);

final String? path = xFile!.path;

//that's the File
final bytes = await File(path!).readAsBytes();
于 2022-02-10T11:26:56.317 回答