Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在RN中模拟本机模块_Javascript_Reactjs_React Native_Mocking_Jestjs - Fatal编程技术网

Javascript 如何在RN中模拟本机模块

Javascript 如何在RN中模拟本机模块,javascript,reactjs,react-native,mocking,jestjs,Javascript,Reactjs,React Native,Mocking,Jestjs,我尝试在react native中模拟模块NativeModules 为了避免在每次测试时复制和粘贴,我尝试创建一个“mocks/react native.js”文件,在其中模拟所讨论的模块。我发现这个教程很有帮助,但不起作用 这是我的模拟文件 import * as ReactNative from 'react-native'; export const NativeModules = { ...ReactNative.NativeModules, SettingsManager:

我尝试在react native中模拟模块
NativeModules

为了避免在每次测试时复制和粘贴,我尝试创建一个“mocks/react native.js”文件,在其中模拟所讨论的模块。我发现这个教程很有帮助,但不起作用

这是我的模拟文件

import * as ReactNative from 'react-native';

export const NativeModules = {
  ...ReactNative.NativeModules,
  SettingsManager: {
    settings: {
      AppleLocale: 'en_US',
    },
  },
};

export const Platform = {
  ...ReactNative.Platform,
  OS: 'ios',
  Version: 123,
  isTesting: true,
  select: (objs) => objs.ios,
};

export const keyboardDismiss = jest.fn();
export const Keyboard = {
  dismiss: keyboardDismiss,
};

export default Object.setPrototypeOf(
  {
    NativeModules,
    Platform,
    Keyboard,
  },
  ReactNative,
);
以下是产生的错误:

TypeError: Cannot read property 'create' of undefined

      1 | import {StyleSheet} from 'react-native';
      2 | 
    > 3 | export default StyleSheet.create({

TypeError: Cannot read property 'get' of undefined
您知道使用模拟文件模拟
NativeModules
模块的另一种方法吗? 或
您知道如何解决这些错误吗?

模拟应该定义
*
导入,而不是
默认值。和ES模块
*
导出

这应该通过使用CommonJS模块来完成,而无需通过原型继承来完成:

const ReactNative = require('react-native');
...
module.exports = {
  ...ReactNative,
  __esModule: true,
  NativeModules,
  Platform,
  Keyboard,
};

模拟应该定义导入,而不是默认导入。和ES模块
*
导出

这应该通过使用CommonJS模块来完成,而无需通过原型继承来完成:

const ReactNative = require('react-native');
...
module.exports = {
  ...ReactNative,
  __esModule: true,
  NativeModules,
  Platform,
  Keyboard,
};

我已经根据你的例子修改了我的模拟,但是我有这个错误<代码>不变冲突:找不到TurboModuleRegistry.getEnforcing(…):“DevSettings”。验证此名称的模块是否已在本机二进制文件中注册。
我不知道如何解决此问题,如果没有模拟,它是否可行?答案用玩笑式模拟解决了这个问题,我不能保证RN在这些模拟中是可行的,因为它可能需要很好地理解RN的内部结构才能以正确的方式模拟它。至于这个错误,这似乎很常见,我已经根据你的例子修改了我的模拟,但是我遇到了这个错误<代码>不变冲突:找不到TurboModuleRegistry.getEnforcing(…):“DevSettings”。验证此名称的模块是否已在本机二进制文件中注册。我不知道如何解决此问题,如果没有模拟,它是否可行?答案用玩笑式模拟解决了这个问题,我不能保证RN在这些模拟中是可行的,因为它可能需要很好地理解RN的内部结构才能以正确的方式模拟它。至于错误,似乎很常见,