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.js
Où bugSnag.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()
};
});
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.
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)
}
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 :-)
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