我正试图在我的react-native 项目上设置Jest ,但它对bugsnag-react-native的效果并不好.

在我当前的测试配置中,我看到了与bugsnag的leaveBreadcrumb函数相关的错误,如下所示:

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

    TypeError: Cannot read property 'default' of undefined

      at Object.<anonymous> (app/__tests__/NetworkReducer.test.js:10:20)
          at Generator.next (<anonymous>)
          at Promise (<anonymous>)

我有一个用于实例化bugsnag的帮助文件:

helpers/bugSnag.js


//-------------------------------------------------------------------------------------------------
// Create a single instance of the bugsnag client so we don't have to duplicate our configuration
// anywhere.
//-------------------------------------------------------------------------------------------------
// https://docs.bugsnag.com/platforms/react-native/#basic-configuration

import { Client, Configuration } from 'bugsnag-react-native';
const config = new Configuration();
config.consoleBreadcrumbsEnabled = true;
config.notifyReleaseStages = ['testflight', 'production'];

const bugSnag = new Client(config);


export default bugSnag;

所以在我所有的文件中,我都从这个助手文件中导入bugSnag,而不是在每个文件中声明一个新的客户机,尤其是在我的NetworkReducer.js中,bugSnag.leaveBreadcrumb('someData')导致了我的问题.

在我的NetworkReducer.test.js篇文章中,我称之为模拟:

 jest.mock(bugSnag, () => {
    return {
        leaveBreadcrumb: jest.fn()
    };
 });

我还进口了bugSnag from path/to/helpers/bugSnag

如果我对模拟进行注释,我会在每个减速器类型上收到不同的错误消息,这些减速器类型的值为bugSnag.leaveBreadcrumb('someData'),如下所示:

TypeError: _bugSnag2.default.leaveBreadcrumb is not a function

  at Object.network_prop_update (app/reducers/NetworkReducer.js:29:19)
  at app/reducers/createReducer.js:4:29
  at Object.<anonymous> (app/__tests__/NetworkReducer.test.js:80:29)
  at tryCallTwo (node_modules/promise/lib/core.js:45:5)
  at doResolve (node_modules/promise/lib/core.js:200:13)
  at new Promise (node_modules/promise/lib/core.js:66:3)

我以为我搞错了.我附上了我的Jest setup.js作为额外参考:

    jest.mock('Linking', () => {
    return {
        addEventListener: jest.fn(),
        removeEventListener: jest.fn(),
        openURL: jest.fn(),
        canOpenURL: jest.fn(),
        getInitialURL: jest.fn(),
    };
});


jest.mock('PushNotificationIOS', () => {
    return {
        addEventListener: jest.fn(),
        requestPermissions: jest.fn(() => Promise.resolve()),
        getInitialNotification: jest.fn(() => Promise.resolve()),
    };
});


jest.mock('react-native-intercom', () => {
    return {
        registerIdentifiedUser: jest.genMockFn().mockReturnValue(Promise.resolve()),
        registerUnidentifiedUser: jest.genMockFn().mockReturnValue(Promise.resolve()),
        updateUser: jest.genMockFn().mockReturnValue(Promise.resolve()),
        reset: jest.genMockFn().mockReturnValue(Promise.resolve()),
        logEvent: jest.genMockFn().mockReturnValue(Promise.resolve()),
        handlePushMessage: jest.genMockFn().mockReturnValue(Promise.resolve()),
        displayMessenger: jest.genMockFn().mockReturnValue(Promise.resolve()),
        hideMessenger: jest.genMockFn().mockReturnValue(Promise.resolve()),
        displayMessageComposer: jest.genMockFn().mockReturnValue(Promise.resolve()),
        displayMessageComposerWithInitialMessage: jest.genMockFn().mockReturnValue(Promise.resolve()),
        displayConversationsList: jest.genMockFn().mockReturnValue(Promise.resolve()),
        getUnreadConversationCount: jest.genMockFn().mockReturnValue(Promise.resolve()),
        setLauncherVisibility: jest.genMockFn().mockReturnValue(Promise.resolve()),
        setInAppMessageVisibility: jest.genMockFn().mockReturnValue(Promise.resolve()),
        setupAPN: jest.genMockFn().mockReturnValue(Promise.resolve()),
        registerForPush: jest.genMockFn().mockReturnValue(Promise.resolve()),
        setUserHash: jest.genMockFn().mockReturnValue(Promise.resolve()),
        setBottomPadding: jest.genMockFn().mockReturnValue(Promise.resolve()),
        addEventListener: jest.fn(),
        removeEventListener: jest.fn()
    };
});


jest.mock('bugsnag-react-native', () => {
    return {
        leaveBreadcrumb: jest.fn(),
        Configuration: jest.fn(),
        Client: jest.fn()
    };
});

推荐答案

我的解决方案是添加以下模拟:

jest.mock('../app/helpers/bugSnag', () => {
    return {
        leaveBreadcrumb: jest.fn(),
    };
});

对这一切进行清楚的解释会有所帮助.

React-native相关问答推荐

Redux toolkit通过按钮操作进行查询

React Native在同一页面上使用多个不同的导航器

react 本机中的TextInput对齐中的长文本

Reaction-原生NavBottom设计背景

Touchabble 不透明度不工作-react 本机

将 Cognito 用户与真实数据库用户联系起来的最佳方式是什么?

React Native - React Native 架构

React-native 重置数据库

如何获取 iOS 版本?

Android Studio 为构建设置 node 目录(Cause: error=2, No such file or directory)

找不到变量 atob

如何在 mac 上卸载 react-native-cli?

如何在 Crashlytics (Fabrics) 中有效地对非致命异常进行分组?

中彼此相邻对齐(Align) react native

如何在react native中过滤对象数组?

背景图像在react中不起作用

react-native run-android 构建错误':app:generateDebugBuildConfig'

在 webview 中检测touch 是 Apple Pencil 还是手指(react-native)

手动调用 React.PropTypes 验证 React native "^0.30.0"

React Native - 导航问题undefined is not an object (this.props.navigation.navigate)