javascript - 开 Jest : Error when trying to import Native Modules; unable to prevent with Mock

标签 javascript ios react-native jestjs babel-jest

我最近作为测试工程师加入了一个团队,我正在尝试在我们的 React Native 应用程序上启动和运行 Jest 单元测试。我的前任已经编写了数十个单元测试,其中大部分都没有成功运行。

运行 npm test 时出现以下错误

 FAIL  __tests__/index.test.js
  ● Test suite failed to run

TypeError: Cannot read property '_addDeviceToGroup' of undefined

  4 | } from 'react-native';
  5 | const {
> 6 |   _addDeviceToGroup,
    |   ^
  7 | } = NativeModules._BleAssociator
  8 | const {
  9 |   _queryName,

  at Object._addDeviceToGroup (app/utils/mesh.js:6:3)
  at Object.<anonymous> (app/actions/hierarchy.js:26:1)
  at Object.<anonymous> (app/actions/organizations.js:14:1)

问题似乎是在我们实现后端团队编写的自定义 native 模块时出现的(同样是在我加入团队之前)。

经过一些研究,我决定继续假设这与 Jest 无法解析在 native 模块中提供的引擎中的 Objective-C 有关,而不是我们的堆栈存在问题(很高兴考虑这种可能性) ,不过)。

我已经审阅了 Jest 文档,并专门梳理了几个相关文档( Mock FunctionsUsing Jest with ES Module ImportsTesting Native Modules with Jest MockReact Native Modules Guide )

我的问题似乎与 this issue 相同;但是,该修复对我不起作用。即使在模拟 NativeModules 时,我也会遇到同样的错误。

我已经熟悉了 Jest 模拟被提升到 import 语句之上的概念,但我不清楚为什么这些模拟位于我上面链接的问题中的描述 block 中(除了可能重置模拟函数之外)对于每个新测试,以防混淆 .mock 属性的返回数据……我离题了)。

对我来说,错误似乎是在导入期间发生的,在执行任何代码之前。为了测试这一点,我来来回回,注释掉除了导入语句和模拟之外的所有内容。这样做,我仍然遇到同样的错误。当我使用 beforeEach() mocha 语句时也是这种情况,如上面链接的问题的解决方案。

修复此错误的唯一方法是完全注释掉导入。

我还没有尝试过错误处理(try/catch),因为我不确定如果执行了 catch block ,我如何仍然可以成功导入我正在测试的组件。

对所有的背景感到抱歉。我在这上面花了几个工作日,所以我想确保我的所有基础都得到了覆盖。

这是一个示例测试:

/__tests__/app/components/Onboarding/Splash/Splash.test.js

import {
  NativeModules,
} from 'react-native';

import { Splash } from '../../../../../app/components/Onboarding/Splash/Splash.js';
// import login from '../../../../../app/actions/login';

// NativeModules._BleAssociator._addDeviceToGroup = jest.fn();
// login = jest.fn;

export default function({React, shallow}) {

  const props = {
    // some test props
  };

  function make({navigation, getUserInfo, verifyUser, login} = props) {
    return shallow(
      // renders the component with props
    );
  }

  describe('<Splash />', () => {
    // I added this part (didn't help)
    beforeEach(() => {
      NativeModules._BleAssociator._addDeviceToGroup = jest.fn();
      login = jest.fn;
    });
    // end part I added
    
    // stuff (all the tests are in here)

  });

}

NativeModules 和登录导入、注释掉的行以及 beforeEach() block 是我间歇性尝试过的但无济于事。

当尝试跟踪此错误时,我发现在运行尝试导入 NativeModules 的脚本(因为 ES6 import 运行它引用的脚本)的原始 Splash.js 中注释掉 import 语句可以修复我看到的错误。正如您可能已经从堆栈跟踪中收集到的那样,这些深入了许多层次。

唷。如果您已经读到这里,非常感谢您的帮助。

很抱歉有这么长而复杂的问题。如您所见,我们有一个庞大而复杂的堆栈。上述问题的修复可能不起作用,因为在出​​现错误之前发生了多少链式导入。

如果它是一个我遗漏的小修复程序,或者如果有某种我不知道的“浅层”导入,我会喜欢它。

非常感谢您的帮助。欢迎任何意见。

最佳答案

我找到了解决这个问题的方法。我一直担心模拟可能没有通过所有导入声明进行跟踪。真正发生的是我错误地格式化了模拟。

我没有在标准的 Jest 文档中看到它,而是找到了它 here .

将此添加到我的 *.test.js 文件中有效:

import { NativeModules } from 'react-native';
jest.mock('NativeModules', () => {
  return {
    _BleAssociator: {
      _addDeviceToGroup: jest.fn()
    },
    // ... and so on for all the other methods expected in NodeModules
  };
});

为了后代,我认为最好将其保存在自己的脚本中并导入到测试中……我还没有尝试过。

关于javascript - 开 Jest : Error when trying to import Native Modules; unable to prevent with Mock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53510385/

相关文章:

javascript - .map 在 Heroku 上部署时不是函数

React-native Awesome 项目未构建 android 项目

javascript - 表排序多选下拉列表

javascript - 如何使用访问 token 和 ID token 对认知用户进行身份验证

javascript - d3 中的放大镜

ios - 无限显示本地通知

ios - Swift 5.1 运行时如何与旧版本的 iOS 一起工作?

ios - UIButton 旋转后失去目标

react-native - 使用 ARCGIS 响应 native

reactjs - 如何在 React-Native Webview 中运行 React JS 构建?