В тестовом наборе не удалось запустить TypeError: невозможно прочитать свойство 'default' из undefined

Я пытаюсь настроить Jest на свой проект, отвечающий за реакцию, но он не играл хорошо с bugsnag-react-native.

p >

С моей текущей конфигурацией теста я вижу ошибки, связанные с функцией 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()
    };
});

Ответ 1

Мое решение состояло в том, чтобы вместо этого добавить следующий макет:

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

Было бы полезно пояснить все это.

Ответ 2

На это уже ответили, но в моем случае у меня была другая проблема. По react-test-renderer видимому, react-test-renderer не может создать экземпляр Компонентов, если им не хватает их конструктора.

Поэтому мне нужно было добавить их следующую строку в мой PureComponent:

constructor(props) {
    super(props)
}

Ответ 3

хотя уже есть принятый ответ, сегодня я решил его по-другому.

После этого ответа на Github я поставил:

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

В моем postinstall скрипте. Я надеюсь, что соответствующий вопрос на Github будет решен, но пока что наша команда работает так :-)

Ответ 4

Я решил это, просто переместив мои классовые переменные в конструктор. Даже если у меня были конструкторы, я все равно получал эту ошибку, поэтому перемещение их в конструктор избавляло от ошибки. Также обнаружил, что здесь: https://github.com/facebook/react-native/issues/22437#issuecomment-445898652