ocetnik / react-native-background-timer

Emit event periodically (even when app is in the background)
MIT License
1.61k stars 228 forks source link

Jest: Invariant Violation: `new NativeEventEmitter()` requires a non-null argument. #367

Open shensven opened 3 years ago

shensven commented 3 years ago

The following error will be reported if jest is not configured

 FAIL  __tests__/App-test.tsx
  ● Test suite failed to run

    Invariant Violation: `new NativeEventEmitter()` requires a non-null argument.

       6 | import {IconButton, TouchableRipple} from 'react-native-paper';
       7 | import Ionicons from 'react-native-vector-icons/Ionicons';
    >  8 | import BackgroundTimer from 'react-native-background-timer';
         | ^
       9 | import dayjs from 'dayjs';
      10 | import relativeTime from 'dayjs/plugin/relativeTime';
      11 | import 'dayjs/locale/zh-cn';

      at invariant (node_modules/invariant/invariant.js:40:15)
      at new NativeEventEmitter (node_modules/react-native/Libraries/EventEmitter/NativeEventEmitter.js:44:7)
      at Object.<anonymous> (node_modules/react-native-background-timer/index.js:10:17)
      at Object.<anonymous> (src/screens/Home.tsx:8:1)
      at Object.<anonymous> (App.tsx:6:1)
      at Object.<anonymous> (__tests__/App-test.tsx:7:1)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        4.29 s, estimated 7 s
Ran all test suites.
error Command failed with exit code 1.

So maybe we should configure jest manually, like:

// jest.setup.js
jest.doMock('react-native-background-timer', () => {
  return {
    stopBackgroundTimer: jest.fn(),
    runBackgroundTimer: jest.fn(),
  };
});

This allows the unit tests to pass with flying colors

repo here: https://github.com/shensven/ReadHubn/tree/5806faf354fbd178827aff9985efe4dea906c24d

test here: https://github.com/shensven/ReadHubn/runs/3824410010?check_suite_focus=true

ronaldaraujo commented 2 years ago

+1

s956142 commented 2 years ago

72

jest.mock("react-native-background-timer", () => {});

princefishthrower commented 2 years ago

The suggested solution didn't work for me.

While this error appears to come from react-native-background-timer, the true culprit, if you look carefully, is react-native/Libraries/EventEmitter/NativeEventEmitter, I solved this by adding the following to my jest.setup.js :

jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter');
ghost commented 2 years ago

i seem to be getting another error after doing this? i'm currently trying to mock deviceInfo module like so:

jest.mock('react-native-device-info', () => ({
  ...jest.requireActual('react-native-device-info'),
  getBuildNumber: jest.fn(() => 99),
}));

i got this error : Invariant Violation: new NativeEventEmitter() requires a non-null argument.

After adding the jest mock for NativeEventEmitter i get this error:

 react-native-device-info: NativeModule.RNDeviceInfo is null. To fix this issue try these steps:
      • For react-native <= 0.59: Run `react-native link react-native-device-info` in the project root.
      • Rebuild and re-run the app.
      • If you are using CocoaPods on iOS, run `pod install` in the `ios` directory and then rebuild and re-run the app. You may also need to re-open Xcode to get the new pods.
      If none of these fix the issue, please open an issue on the Github repository: https://github.com/react-native-device-info/react-native-device-info
mizutani256 commented 2 years ago

This might also be a solution: https://github.com/react-native-device-info/react-native-device-info/issues/1360#issuecomment-1004822298

ivelinov94 commented 2 years ago

The suggested solution didn't work for me.

While this error appears to come from react-native-background-timer, the true culprit, if you look carefully, is react-native/Libraries/EventEmitter/NativeEventEmitter, I solved this by adding the following to my jest.setup.js :

jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter');

@princefishthrower

this helped a lot.=, Thanks man :)

AdamuAbba commented 2 years ago

The suggested solution didn't work for me.

While this error appears to come from react-native-background-timer, the true culprit, if you look carefully, is react-native/Libraries/EventEmitter/NativeEventEmitter, I solved this by adding the following to my jest.setup.js :

jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter');

please where do I find this setup file? as all the answers seem vague

NanyThery commented 1 year ago

@AdamuAbba if you have Jest installed in your project you will find this file in the root of your project. The name of the file is jest.setup.js. If you are using VsCode, you can press Ctrl+P / Command+P and search by file name. Open that file and inside just paste the line mentioned by @princefishthrower

AdamuAbba commented 1 year ago

@AdamuAbba if you have Jest installed in your project you will find this file in the root of your project. The name of the file is jest.setup.js. If you are using VsCode, you can press Ctrl+P / Command+P and search by file name. Open that file and inside just paste the line mentioned by @princefishthrower

OMG, this is the best reply so far, so direct and straight to the point. thanks, you're a lifesaver 🔥

Balthazar33 commented 1 year ago

The suggested solution didn't work for me.

While this error appears to come from react-native-background-timer, the true culprit, if you look carefully, is react-native/Libraries/EventEmitter/NativeEventEmitter, I solved this by adding the following to my jest.setup.js :

jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter');

@AdamuAbba I get jest is not defined if I add this in my jest.setup.js file

AdamuAbba commented 1 year ago

@Balthazar33 did you try importing jest like so at the top of your jest.setup.js file ?

import {jest} from '@jest/globals'

in an ideal environment, this should not be necessary tho for global modules ..... i think.

shariqahmedAirasia commented 1 year ago

jest.setup.js

after adding the above line I am getting this error : TypeError: _reactNative.NativeEventEmitter is not a constructor

TomJerry56 commented 1 year ago

jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter');

jest.setup.json file doesn't exist

NanyThery commented 1 year ago

You have to create it

El El mar, 27 jun 2023 a las 11:35, TomJerry56 @.***> escribió:

jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter');

jest.setup.json file doesn't exist

— Reply to this email directly, view it on GitHub https://github.com/ocetnik/react-native-background-timer/issues/367#issuecomment-1609139455, or unsubscribe https://github.com/notifications/unsubscribe-auth/ALKLCYPGUURQLCEGIEBDBQ3XNKSN7ANCNFSM5FQWR2BQ . You are receiving this because you commented.Message ID: @.***>

-- Nadine Thêry

NadineThery.com | Linkedin https://www.linkedin.com/in/nadinethery/ | Twitter http://www.twitter.com/nanythery |

TomJerry56 commented 1 year ago

You have to create it El El mar, 27 jun 2023 a las 11:35, TomJerry56 @.> escribió: jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter'); jest.setup.json file doesn't exist — Reply to this email directly, view it on GitHub <#367 (comment)>, or unsubscribe https://github.com/notifications/unsubscribe-auth/ALKLCYPGUURQLCEGIEBDBQ3XNKSN7ANCNFSM5FQWR2BQ . You are receiving this because you commented.Message ID: @.> -- Nadine Thêry NadineThery.com | Linkedin https://www.linkedin.com/in/nadinethery/ | Twitter http://www.twitter.com/nanythery |

getting same error, Do I need add any other changes in tsconfig related to jest.setup.js?

smarchesini-DQ commented 1 year ago

jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter'); seems to work for me if I put it in the single test file, but not in jest.setup.json (I checked that the file is correctly loaded, and tried both with and without import { jest } from '@jest/globals'; I am curious as to why one works and not the other.

davidecarpini commented 1 year ago

these two lines in 'jest.setup.js' fixed the issue for the same error in react-native-device-info

import mockRNDeviceInfo from "react-native-device-info/jest/react-native-device-info-mock"
jest.mock("react-native-device-info", () => mockRNDeviceInfo)

maybe it's a similar issue

anaarezo commented 10 months ago

The suggested solution didn't work for me.

While this error appears to come from react-native-background-timer, the true culprit, if you look carefully, is react-native/Libraries/EventEmitter/NativeEventEmitter, I solved this by adding the following to my jest.setup.js :

jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter');

Great, this line wasn't mandatory on my case, but helped me to identify the correct problem, because show the real problem. Thank you very much!