Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
shensven opened this issue Oct 7, 2021 · 18 comments · May be fixed by #520
Open

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

shensven opened this issue Oct 7, 2021 · 18 comments · May be fixed by #520

Comments

@shensven
Copy link

shensven commented Oct 7, 2021

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
Copy link

+1

@s956142
Copy link

s956142 commented Oct 25, 2021

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

@princefishthrower
Copy link

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
Copy link

ghost commented Jun 21, 2022

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
Copy link

This might also be a solution: react-native-device-info/react-native-device-info#1360 (comment)

@ivelinov94
Copy link

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
Copy link

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
Copy link

@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
Copy link

@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
Copy link

Balthazar33 commented Oct 26, 2022

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
Copy link

@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
Copy link

jest.setup.js

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

@TomJerry56
Copy link

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

jest.setup.json file doesn't exist

@NanyThery
Copy link

NanyThery commented Jun 27, 2023 via email

@TomJerry56
Copy link

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
Copy link

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
Copy link

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
Copy link

anaarezo commented Nov 17, 2023

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!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.