描述
我需要编写一个e2e测试,在某些时候它必须在UIImagePickerController中选择一个图像,我试图无用地使用element(by.type('UIImagePickerController')). tapAtPoint()
。我需要一种选择图像的方法。我已经找到了way可以通过 native 测试来做到这一点。
而且对我来说, mock 也不是一种选择,因为我使用了一个react-native-repackeger所需的更高版本。
重现步骤
element(by.type('UIImagePickerController')).tapAtPoint({ x: 50, y: 200 })
排毒,节点,设备,Xcode和macOS版本
设备和详细的排毒日志
没有日志,设备会在正确的位置点击,但点击不会生效。
最佳答案
注意到最初的问题表明在提出的案例中模拟不是一个选择,但是我在寻找解决方案时几次遇到了这个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。