描述

我需要编写一个e2e测试,在某些时候它必须在UIImagePickerController中选择一个图像,我试图无用地使用element(by.type('UIImagePickerController')). tapAtPoint()。我需要一种选择图像的方法。我已经找到了way可以通过 native 测试来做到这一点。

而且对我来说, mock 也不是一种选择,因为我使用了一个react-native-repackeger所需的更高版本。

重现步骤

  • 与使用图像选择器
  • 的任何应用程序一起使用
  • 尝试使用element(by.type('UIImagePickerController')).tapAtPoint({ x: 50, y: 200 })

  • 排毒,节点,设备,Xcode和macOS版本

  • 排毒:6.0.2
  • 节点:8.9.0
  • 设备:iOS Simulator 6s
  • Xcode:9.2
  • macOS:10.13.1
  • React-Native:0.46.4

  • 设备和详细的排毒日志

    没有日志,设备会在正确的位置点击,但点击不会生效。

    最佳答案

    注意到最初的问题表明在提出的案例中模拟不是一个选择,但是我在寻找解决方案时几次遇到了这个Stack Overflow问题,并想分享自己最终针对我的情况提出的想法。

    通过将react-native-image-picker包装在自己的导出文件中,我可以解决e2e测试的局限性:

    ImagePicker.js

    import ImagePicker from 'react-native-image-picker';
    
    export default ImagePicker;
    

    然后使用自定义扩展名(即e2e.js)创建一个模拟:

    ImagePicker.e2e.js
    const mockImageData = '/9j/4AAQSkZ...MORE BASE64 DATA OF CUTE KITTENS HERE.../9k=';
    
    export default {
      showImagePicker: function showImagePicker(options, callback) {
        if (typeof options === 'function') {
          callback = options;
        }
    
        callback({
          data: mockImageData,
        });
      },
    };
    

    最后,配置Metro bundler优先处理您的自定义扩展名:

    [项目根]/rn-cli.config.js
    const defaultSourceExts = require('metro-config/src/defaults/defaults')
      .sourceExts;
    
    module.exports = {
      resolver: {
        sourceExts: process.env.RN_SRC_EXT
          ? process.env.RN_SRC_EXT.split(',').concat(defaultSourceExts)
          : defaultSourceExts,
      },
    };
    

    然后在RN_SRC_EXT环境变量设置为自定义扩展名的情况下运行:
    RN_SRC_EXT=e2e.js react-native start
    

    有关更多信息,请参见Detox Mocking Guide

    10-08 15:48