测试套件无法运行TypeError:无法读取未定义的属性"default"

Mat*_*K14 14 javascript unit-testing reactjs jestjs react-native

我正在尝试在我的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>)
Run Code Online (Sandbox Code Playgroud)

我有一个实例化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;
Run Code Online (Sandbox Code Playgroud)

因此,在我的所有文件中,我从这个帮助文件导入bugSnag,而不是在每个文件中声明一个新客户端,特别是在我的NetworkReducer.js位置bugSnag.leaveBreadcrumb('someData')导致我出现问题.

在我NetworkReducer.test.js我称之为模拟:

 jest.mock(bugSnag, () => {
    return {
        leaveBreadcrumb: jest.fn()
    };
 });
Run Code Online (Sandbox Code Playgroud)

我也在哪里进口 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)
Run Code Online (Sandbox Code Playgroud)

我以为我已经掌握了这个开玩笑的东西,并且嘲笑,但我想我被证明是错的.我附上了我的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()
    };
});
Run Code Online (Sandbox Code Playgroud)

Sam*_*rad 18

这已经得到了回答,但就我而言,我有一个不同的问题.react-test-renderer如果它们缺少构造函数,显然无法实例化组件.

所以我需要按照以下方式添加它们PureComponent:

constructor(props) {
    super(props)
}
Run Code Online (Sandbox Code Playgroud)

  • 您确定@ pietro909吗?刚刚用`16.8.4`进行了测试...如果删除构造函数,我仍然会得到相同的行为 (2认同)

Mat*_*K14 5

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

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

对所有这些进行清晰的解释将很有帮助。

  • 嗯当然了 我应该想到这个。通过玩笑,您想模拟从中导入的ES6模块。因此,如果要从库中导入,则说“从'dep'中导入x”,并因此用`jest.mock('dep',()=&gt; {})`进行模拟,但是由于`bugSnag`是一个本地文件,您可以通过其路径导入并进行模拟。 (2认同)

pie*_*909 5

尽管已经有了一个可以接受的答案,但是我今天以不同的方式解决了它。

Github上回答这个问题后,我提出:

sed -i -- 's/inlineRequires: true,/inlineRequires: false,/' node_modules/react-native/jest/preprocessor.js

在我的postinstall脚本中。我希望有关Github的相关问题能够得到解决,但就目前而言,因为我们的团队正在这样工作:-)