web-dev-qa-db-fra.com

La suite de tests n'a pas pu exécuter TypeError: impossible de lire la propriété «par défaut» de non défini

J'essaie de configurer Jest sur mon projet react-native mais il n'a pas joué à Nice avec bugsnag-react-native .

Avec ma configuration de test actuelle, je vois des erreurs liées à la fonction leaveBreadcrumb de bugsnag ci-dessous:

 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>)

J'ai un fichier d'aide qui instancie le 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;

Donc, dans tous mes fichiers, j'importe bugSnag à partir de ce fichier d'aide plutôt que de déclarer un nouveau client dans chaque fichier, notamment dans mon NetworkReducer.jsbugSnag.leaveBreadcrumb('someData') me pose des problèmes.

Dans mon NetworkReducer.test.js J'appelle une maquette:

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

où j'importe également bugSnag from path/to/helpers/bugSnag

Si je commente la maquette, j'obtiens un message d'erreur différent sur chacun de mes types de réducteurs qui ont une bugSnag.leaveBreadcrumb('someData') comme indiqué ci-dessous:

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)

Je pensais que j'avais une idée de cette plaisanterie et de la moquerie, mais je suppose que je me suis trompé. J'ai joint mon setup.js De Jest pour référence supplémentaire:

    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()
    };
});
13
MattyK14

Ma solution a été d'ajouter la maquette suivante à la place:

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

Une explication claire de tout cela serait utile.

5
MattyK14

Cela a déjà été répondu, mais dans mon cas, j'ai eu un problème différent. Apparemment react-test-renderer ne parvient pas à instancier les composants s'il leur manque leur constructeur.

J'ai donc dû les ajouter à mon PureComponent:

constructor(props) {
    super(props)
}
18
Samer Murad

bien qu'il y ait déjà une réponse acceptée, je l'ai résolue d'une manière différente aujourd'hui.

Après cette réponse sur Github , je mets:

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

Dans mon script postinstall. J'espère que le problème pertinent sur Github sera résolu, mais pour l'instant, pour notre équipe fonctionne comme ça :-)

5
pietro909

J'ai résolu cela en déplaçant simplement mes variables de classe dans le constructeur. Même si j'avais des constructeurs, j'ai quand même eu cette erreur, donc les déplacer dans le constructeur s'est débarrassé de l'erreur. A également constaté que ici: https://github.com/facebook/react-native/issues/22437#issuecomment-445898652

0
Aaron