首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jest:尝试导入本机模块时出错;无法使用Mock阻止

问Jest:尝试导入本机模块时出错;无法使用Mock阻止
EN

Stack Overflow用户
提问于 2018-11-28 08:35:15
回答 1查看 2.4K关注 0票数 1

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

我在运行npm test时遇到以下错误

代码语言:javascript
复制
 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 Modules时出现的(同样,在我加入团队之前)。

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

我回顾了Jest文档,特别梳理了几个相关文档(Mock Functions、Using Jest with ES Module Imports、Testing Native Modules with Jest Mock、React Native Modules Guide)

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

我已经熟悉了Jest mock被提升到import语句之上的概念,但我不清楚为什么这些mock会出现在上面链接的问题中的describe块中(除了为每个新测试重置mock函数,以免混淆.mock属性的返回数据...我离题了)。

在我看来,错误似乎发生在导入过程中,在执行任何代码之前。为了测试这一点,我来回地注释掉了除import语句和mock之外的所有内容。这样做,我仍然得到相同的错误。当我使用beforeEach() mocha语句时也是如此,就像上面链接的问题的解决方案一样。

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

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

很抱歉有这么多背景知识。我已经在这上面花了几个工作日,所以我想确保我所有的基础都被覆盖了。

下面是一个示例测试:

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

​

代码语言:javascript
复制
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()块都是我断断续续尝试过的,但都无济于事。

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

呼。如果你已经读到这里,我真的很感谢你的帮助。

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

如果它是我遗漏的一个小补丁,或者如果有某种我不知道的“浅层”-ish导入,我会很高兴的。

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

EN

回答 1

Stack Overflow用户

发布于 2018-11-28 09:30:44

我找到了解决这个问题的办法。我一直在担心,也许所有的import语句都没有跟踪到mock。真正发生的事情是我把mock的格式设置错了。

我没有在标准的Jest文档中看到这一点,而是发现它是here。

将此代码添加到我的*.test.js文件中起作用:

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

为了后人着想,我认为最好将它保存在自己的脚本中,并导入到测试中……我还没试过这个呢。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53510385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档