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

TypeError: expect.extend is not a function #3215

Closed
billnbell opened this issue May 5, 2022 · 26 comments
Closed

TypeError: expect.extend is not a function #3215

billnbell opened this issue May 5, 2022 · 26 comments
Labels
Missing info The user didn't precise the problem enough Missing repro This issue need minimum repro scenario Needs review Issue is ready to be reviewed by a maintainer

Comments

@billnbell
Copy link

Latest RN 2.8.0 "react-native-reanimated": "2.8.0".

Getting:
FAIL src/tests/ComponentRender-test.tsx
● Test suite failed to run

TypeError: expect.extend is not a function

  at Object.setUpTests (node_modules/react-native-reanimated/lib/reanimated2/jestUtils.js:219:10)
  at Object.<anonymous> (jestSetupFile.js:163:62)
@billnbell billnbell added the Needs review Issue is ready to be reviewed by a maintainer label May 5, 2022
@github-actions github-actions bot added the Missing repro This issue need minimum repro scenario label May 5, 2022
@github-actions
Copy link

github-actions bot commented May 5, 2022

Hey! 👋

The issue doesn't seem to contain a minimal reproduction.

Could you provide a snippet of code, a snack or a link to a GitHub repository that reproduces the problem?

@github-actions github-actions bot added the Missing info The user didn't precise the problem enough label May 5, 2022
@github-actions
Copy link

github-actions bot commented May 5, 2022

Hey! 👋

It looks like you've omitted a few important sections from the issue template.

Please complete Description, Snack or minimal code example, Package versions and Affected platforms sections.

@billnbell
Copy link
Author

This happens on jest upgrade from ^27.5.1 → ^28.0.3

@matt-oakes
Copy link

To fix this:

  1. Ensure you are calling this inside a script script that runs in setupFilesAfterEnv NOT setupFiles
  2. Change the import in the script to const { expect } = require('@jest/globals'); from const expect = require('expect'); with patch-package

I have opened a PR to fix this here: #3217

@finalight
Copy link

To fix this:

  1. Ensure you are calling this inside a script script that runs in setupFilesAfterEnv NOT setupFiles
  2. Change the import in the script to const { expect } = require('@jest/globals'); from const expect = require('expect'); with patch-package

I have opened a PR to fix this here: #3217

i've tried the same thing you did, but it still shows me the same error

@mayconline
Copy link

To fix this:

  1. Ensure you are calling this inside a script script that runs in setupFilesAfterEnv NOT setupFiles
  2. Change the import in the script to const { expect } = require('@jest/globals'); from const expect = require('expect'); with patch-package

I have opened a PR to fix this here: #3217

same error, i believe this resolve this error when merge,
link do helper: https://jestjs.io/pt-BR/docs/upgrading-to-jest28

piaskowyk pushed a commit that referenced this issue Jul 1, 2022
## Description

Fixes for Jest 28 compatability (Issue #3215)

## Changes

- Change the import for expect to maintain compatability with Jest 28.
- Updated the documentation to ensure the enviornment is set up before running the script.

## Checklist

- [x] Included code example that can be used to test this change
- [x] Updated TS types
- [x] Added TS types tests
- [x] Added unit / integration tests
- [x] Updated documentation
- [x] Ensured that CI passes
@finalight
Copy link

the PR is merged, but i still facing the same error

  ● Test suite failed to run

    TypeError: expect.extend is not a function

      22 | }
      23 |
    > 24 | require('react-native-reanimated/lib/reanimated2/jestUtils').setUpTests()
         |                                                              ^
      25 |
      26 | // eslint-disable-next-line no-underscore-dangle
      27 | global.__reanimatedWorkletInit = jest.fn()

      at Object.extend [as setUpTests] (node_modules/react-native-reanimated/lib/reanimated2/jestUtils.js:152:12)
      at Object.setUpTests (jest-utils/jest.setup.js:24:62)

@Norfeldt
Copy link
Contributor

Norfeldt commented Aug 25, 2022

@matt-oakes
Here is a repo showing how it breaks after upgrading to jest 28 https://github.com/Norfeldt/expo-46-with-jest-rtnl-reanimated

When I try to run it in my private repo with jest ~26 it blows up:

yarn run v1.22.19
$ jest --config='./test/jest/config.js' --colors --coverage=false --forceExit --runInBand
watchman warning:  Recrawled this watch 257 times, most recently because:
MustScanSubDirs UserDroppedTo resolve, please review the information on
https://facebook.github.io/watchman/docs/troubleshooting.html#recrawl
To clear this warning, run:
...

ReferenceError: You are trying to `import` a file after the Jest environment has been torn down.

      at Object.get findNodeHandle [as findNodeHandle] (node_modules/react-native/index.js:196:12)
      at AnimatedComponent._detachPropUpdater (node_modules/react-native-reanimated/lib/createAnimatedComponent.js:490:40)
      at AnimatedComponent.componentWillUnmount (node_modules/react-native-reanimated/lib/createAnimatedComponent.js:243:14)
      at callComponentWillUnmountWithTimer (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:12755:14)
      at safelyCallComponentWillUnmount (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:12762:5)

ReferenceError: You are trying to `import` a file after the Jest environment has been torn down.

      15 |       {props.children}
      16 |     </TouchableWithoutFeedback>
    > 17 |   )
         |    ^
      18 | }
      19 |

      at Object.get TouchableWithoutFeedback [as TouchableWithoutFeedback] (node_modules/react-native/index.js:126:12)
      at DismissKeyboard (components/DismissKeyboard/index.tsx:17:44)
      at describeNativeComponentFrame (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2031:7)
      at describeFunctionComponentFrame (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2126:12)
      at describeFiber (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2783:14)

  ●  Cannot log after tests are done. Did you forget to wait for something async in your test?
    Attempted to log "The above error occurred in the <AnimatedComponent(Text)> component:

        at AnimatedComponent (/Users/norfeldt/repos/NORD.investments/expo-app/node_modules/react-native-reanimated/lib/createAnimatedComponent.js:150:36)
        at Moti (/Users/norfeldt/repos/NORD.investments/expo-app/node_modules/@motify/core/lib/commonjs/motify.tsx:55:9)
        

@github-actions github-actions bot added Repro provided A reproduction with a snippet of code, snack or repo is provided and removed Missing repro This issue need minimum repro scenario labels Aug 25, 2022
@billnbell
Copy link
Author

still erroring!!!!!!

@github-actions github-actions bot added Missing repro This issue need minimum repro scenario and removed Repro provided A reproduction with a snippet of code, snack or repo is provided labels Aug 25, 2022
@Norfeldt
Copy link
Contributor

It's not missing a repo. I provided a minimal example repro that reproduce the issue.

@github-actions github-actions bot added Repro provided A reproduction with a snippet of code, snack or repo is provided and removed Missing repro This issue need minimum repro scenario labels Aug 26, 2022
@billnbell
Copy link
Author

pretty simple repo. I just added require('react-native-reanimated/lib/reanimated2/jestUtils').setUpTests(); in the setup-tests.js and it fails with expect.extend is not a function

 FAIL  src/components/member/explore/destination-screen/__tests__/helpers.test.ts
  ● Test suite failed to run

    TypeError: expect.extend is not a function

      1 | import 'react-native';
      2 |
    > 3 | require('react-native-reanimated/lib/reanimated2/jestUtils').setUpTests();
        |                                                              ^
      4 |

      at Object.extend [as setUpTests] (node_modules/react-native-reanimated/lib/reanimated2/jestUtils.js:160:12)
      at Object.setUpTests (setup-tests.js:3:62)
      at asyncGeneratorStep (node_modules/@babel/runtime/helpers/asyncToGenerator.js:3:16)
      at asyncGeneratorStep (node_modules/@babel/runtime/helpers/asyncToGenerator.js:25:9)

@github-actions github-actions bot added Missing repro This issue need minimum repro scenario and removed Repro provided A reproduction with a snippet of code, snack or repo is provided labels Aug 29, 2022
@billnbell
Copy link
Author

The try/catch is around the wrong things. The fix is:

Go into node_modules/react-native-reanimated/lib/reanimated2/jestUtils.js

export const setUpTests = (userConfig = {}) => {
    require('setimmediate');
    frameTime = Math.round(1000 / config.fps);
    config = Object.assign(Object.assign({}, config), userConfig);
    let expect;
    try {
        expect = require('expect');
        expect.extend({
            toHaveAnimatedStyle(received, expectedStyle, config = {}) {
                return compareStyle(received, expectedStyle, config);
            },
        });
    }
    catch (_) {
        // for Jest in version 28+
        const { expect: expectModule } = require('@jest/globals');
        expect = expectModule;
        expect.extend({
            toHaveAnimatedStyle(received, expectedStyle, config = {}) {
                return compareStyle(received, expectedStyle, config);
            },
        });
    }
};

@billnbell
Copy link
Author

Patch file

diff --git a/node_modules/react-native-reanimated/lib/reanimated2/jestUtils.js b/node_modules/react-native-reanimated/lib/reanimated2/jestUtils.js
index d8befd8..9e41d37 100644
--- a/node_modules/react-native-reanimated/lib/reanimated2/jestUtils.js
+++ b/node_modules/react-native-reanimated/lib/reanimated2/jestUtils.js
@@ -145,23 +145,28 @@ export const advanceAnimationByFrame = (count) => {
     jest.advanceTimersByTime(frameTime);
 };
 export const setUpTests = (userConfig = {}) => {
+    require('setimmediate');
+    frameTime = Math.round(1000 / config.fps);
+    config = Object.assign(Object.assign({}, config), userConfig);
     let expect;
     try {
         expect = require('expect');
+        expect.extend({
+            toHaveAnimatedStyle(received, expectedStyle, config = {}) {
+                return compareStyle(received, expectedStyle, config);
+            },
+        });
     }
     catch (_) {
         // for Jest in version 28+
         const { expect: expectModule } = require('@jest/globals');
         expect = expectModule;
+        expect.extend({
+            toHaveAnimatedStyle(received, expectedStyle, config = {}) {
+                return compareStyle(received, expectedStyle, config);
+            },
+        });
     }
-    require('setimmediate');
-    frameTime = Math.round(1000 / config.fps);
-    config = Object.assign(Object.assign({}, config), userConfig);
-    expect.extend({
-        toHaveAnimatedStyle(received, expectedStyle, config = {}) {
-            return compareStyle(received, expectedStyle, config);
-        },
-    });
 };
 export const getAnimatedStyle = (received) => {
     return getCurrentStyle(received);

@billnbell
Copy link
Author

Also, for RV 0.69+hermes has moved to c++17 and it needs to be modified:

s.xcconfig               = {
    "CLANG_CXX_LANGUAGE_STANDARD" => "c++14",
    "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/boost-for-react-native\" \"$(PODS_ROOT)/glog\" \"$(PODS_ROOT)/#{folly_prefix}Folly\" \"${PODS_ROOT}/Headers/Public/React-hermes\" \"${PODS_ROOT}/Headers/Public/hermes-engine\"",
                               "OTHER_CFLAGS" => "$(inherited)" + " " + folly_flags  }

Change to:

s.xcconfig               = {
    "CLANG_CXX_LANGUAGE_STANDARD" => "c++17",
    "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/boost-for-react-native\" \"$(PODS_ROOT)/glog\" \"$(PODS_ROOT)/#{folly_prefix}Folly\" \"${PODS_ROOT}/Headers/Public/React-hermes\" \"${PODS_ROOT}/Headers/Public/hermes-engine\"",
                               "OTHER_CFLAGS" => "$(inherited)" + " " + folly_flags  }

@Norfeldt
Copy link
Contributor

@billnbell thank you very much for sharing your fix for the issue 🙌 (will try it later this week)

@billnbell github-actions seems to think that there still are missing a repo - does it have to be you that add it? If so you can perhaps fork mine or link to it?

@github-actions github-actions bot added the Repro provided A reproduction with a snippet of code, snack or repo is provided label Aug 29, 2022
@github-actions github-actions bot removed the Missing repro This issue need minimum repro scenario label Aug 29, 2022
@Norfeldt
Copy link
Contributor

Norfeldt commented Sep 7, 2022

@billnbell is it too much to ask if you could make a PR to show the fix to the demo repo I have provided?

@yusufyildirim
Copy link
Contributor

Here's the fix #3559

@github-actions github-actions bot added Missing repro This issue need minimum repro scenario and removed Repro provided A reproduction with a snippet of code, snack or repo is provided labels Sep 10, 2022
@billnbell
Copy link
Author

This does not require a repo. Install React Native 0.70 and create a simple jest test, and it blows up.

The fixes provided above work well.

@Norfeldt
Copy link
Contributor

@yusufyildirim

Here's the fix #3559

Tried to open the PR, copy the content from the file changed into the my node_modules/react-native-reanimated2 and do a yarn patch-package react-native-reanimated - did not work. Then I took the suggestion from @billnbell #3215 (comment) and replaced the content in the patch to that. Now it seems to get pass the expect extend error.

There still seems to be some issues regarding "now"

TextField › input field › has accessibility label and hint for the input field

    TypeError: Cannot read properties of undefined (reading 'now')

      at Object.now (node_modules/react-native-reanimated/lib/reanimated2/js-reanimated/JSReanimated.js:14:72)
      at JSReanimated.now [as getTimestamp] (node_modules/react-native-reanimated/lib/reanimated2/js-reanimated/JSReanimated.js:25:34)
      at Timeout.getTimestamp [as _onTimeout] (node_modules/react-native-reanimated/lib/reanimated2/js-reanimated/JSReanimated.js:32:37)

Screenshot 2022-09-14 at 15 10 12

<PATH>/expo-app/node_modules/react-native-reanimated/lib/reanimated2/js-reanimated/JSReanimated.js:54
          return global.ReanimatedDataMock.now();
                                           ^

TypeError: Cannot read properties of undefined (reading 'now')
    at Object.now (<PATH>/expo-app/node_modules/react-native-reanimated/lib/reanimated2/js-reanimated/JSReanimated.js:14:72)

@github-actions github-actions bot added Repro provided A reproduction with a snippet of code, snack or repo is provided and removed Missing repro This issue need minimum repro scenario labels Sep 14, 2022
@imjamescrain
Copy link

Fwiw, I had to use the following, but it is working for me now:

  1. Use @billnbell code: TypeError: expect.extend is not a function #3215 (comment)
  2. Run npx patch-package react-native-reanimated
  3. This failed because the patch was too big. So I had to temporarily bump up patch-packages maxBuffer which I found here: error: Error: spawnSync git ENOBUFS ds300/patch-package#166 (comment), note this fix is already in place, so I had bump it up even more using maxBuffer: 1024 * 1024 * 100 * 100
  4. This comment keyed me into making sure my config was updated for Jest 28+ from react-native-reanimated. Basically make sure your Jest setup for react-native-reanimated is up to date.
  5. At this point I was good, but then I still needed to commit the files, which I couldn't do because the patch was too big. For that you can use Git Large File Storage (which I'm still setting up).

@github-actions github-actions bot added Missing repro This issue need minimum repro scenario and removed Repro provided A reproduction with a snippet of code, snack or repo is provided labels Oct 12, 2022
@github-actions
Copy link

Hey! 👋

The issue doesn't seem to contain a minimal reproduction.

Could you provide a snack or a link to a GitHub repository under your username that reproduces the problem?

@bmarden
Copy link

bmarden commented Oct 12, 2022

@Norfeldt

I fixed the now() TypeErrors by changing node_modules/react-native-reanimated/lib/reanimated2/js-reanimated/JSReanimated.js line 14. Inside the constructor within the if (isJest()) statement

before

this.timeProvider = { now: () => global.ReanimatedDataMock.now() };

after

this.timeProvider = { now: () => global.performance.now() };

Not sure if this is the right way to go or if it actually fixes the issue, but I'm not getting any more TypeErrors at least.

@Youssef-Durgham
Copy link

@Norfeldt

I fixed the now() TypeErrors by changing node_modules/react-native-reanimated/lib/reanimated2/js-reanimated/JSReanimated.js line 14. Inside the constructor within the if (isJest()) statement

before

this.timeProvider = { now: () => global.ReanimatedDataMock.now() };

after

this.timeProvider = { now: () => global.performance.now() };

Not sure if this is the right way to go or if it actually fixes the issue, but I'm not getting any more TypeErrors at least.

not work for me

@Youssef-Durgham
Copy link

any one fix this error ?

@Youssef-Durgham
Copy link

fixed by doing that
expo start -c
will fix your error

piaskowyk pushed a commit that referenced this issue Nov 3, 2022
## Description
Reanimated is not fully compatible with Jest 28+ even after the PR #3347. Using it with Jest 28+ leads to this error:

<img width="796" alt="Ekran Resmi 2022-09-10 15 00 33" src="https://user-images.githubusercontent.com/22980987/189482337-cc2655f6-9463-4a05-9998-5fc3592f5cc0.png">

The reason is, the "expect" module's export approach has changed starting from Jest 28. It used to export the `expect` function directly, as can be seen [here](https://github.com/facebook/jest/blob/v27.5.1/packages/expect/src/index.ts#L441). 

This means, requiring the "expect" module like this

```ts
const expect = require('expect')
```

was providing direct access to the `expect` function alongside with its attached methods, like `extend`.

This has [changed with Jest 28](https://github.com/facebook/jest/blob/v28.0.0/packages/expect/src/index.ts#L449). `export default expect` is the new export statement, which means requiring the "expect" package returns the module object, instead of the function.

#3347 PR attempts to fix this error by assuming "expect" package should throw an error with Jest 28 and it can catch that and require the "expect" from the `@jest/globals` package for Jest 28+ project but it's not the case in reality. "expect" package is still shipped with Jest 28, so, requiring it doesn't throw an error as expected in the PR.

By knowing the export difference, I checked if the value of the module is object or not after requiring it. If it's an object, it means user is on Jest 28+ codebase. The rest is the same with the previous PR. I require the "expect" function from `@jest/globals` and use it.

Tested on Jest 29 and Jest 27.5.1

Fixes #3553 and #3215.
piaskowyk pushed a commit that referenced this issue Nov 3, 2022
## Description
Reanimated is not fully compatible with Jest 28+ even after the PR #3347. Using it with Jest 28+ leads to this error:

<img width="796" alt="Ekran Resmi 2022-09-10 15 00 33" src="https://user-images.githubusercontent.com/22980987/189482337-cc2655f6-9463-4a05-9998-5fc3592f5cc0.png">

The reason is, the "expect" module's export approach has changed starting from Jest 28. It used to export the `expect` function directly, as can be seen [here](https://github.com/facebook/jest/blob/v27.5.1/packages/expect/src/index.ts#L441). 

This means, requiring the "expect" module like this

```ts
const expect = require('expect')
```

was providing direct access to the `expect` function alongside with its attached methods, like `extend`.

This has [changed with Jest 28](https://github.com/facebook/jest/blob/v28.0.0/packages/expect/src/index.ts#L449). `export default expect` is the new export statement, which means requiring the "expect" package returns the module object, instead of the function.

#3347 PR attempts to fix this error by assuming "expect" package should throw an error with Jest 28 and it can catch that and require the "expect" from the `@jest/globals` package for Jest 28+ project but it's not the case in reality. "expect" package is still shipped with Jest 28, so, requiring it doesn't throw an error as expected in the PR.

By knowing the export difference, I checked if the value of the module is object or not after requiring it. If it's an object, it means user is on Jest 28+ codebase. The rest is the same with the previous PR. I require the "expect" function from `@jest/globals` and use it.

Tested on Jest 29 and Jest 27.5.1

Fixes #3553 and #3215.
geriux pushed a commit to wordpress-mobile/react-native-reanimated that referenced this issue Jan 25, 2023
…n#3559)

Reanimated is not fully compatible with Jest 28+ even after the PR software-mansion#3347. Using it with Jest 28+ leads to this error:

<img width="796" alt="Ekran Resmi 2022-09-10 15 00 33" src="https://user-images.githubusercontent.com/22980987/189482337-cc2655f6-9463-4a05-9998-5fc3592f5cc0.png">

The reason is, the "expect" module's export approach has changed starting from Jest 28. It used to export the `expect` function directly, as can be seen [here](https://github.com/facebook/jest/blob/v27.5.1/packages/expect/src/index.ts#L441).

This means, requiring the "expect" module like this

```ts
const expect = require('expect')
```

was providing direct access to the `expect` function alongside with its attached methods, like `extend`.

This has [changed with Jest 28](https://github.com/facebook/jest/blob/v28.0.0/packages/expect/src/index.ts#L449). `export default expect` is the new export statement, which means requiring the "expect" package returns the module object, instead of the function.

software-mansion#3347 PR attempts to fix this error by assuming "expect" package should throw an error with Jest 28 and it can catch that and require the "expect" from the `@jest/globals` package for Jest 28+ project but it's not the case in reality. "expect" package is still shipped with Jest 28, so, requiring it doesn't throw an error as expected in the PR.

By knowing the export difference, I checked if the value of the module is object or not after requiring it. If it's an object, it means user is on Jest 28+ codebase. The rest is the same with the previous PR. I require the "expect" function from `@jest/globals` and use it.

Tested on Jest 29 and Jest 27.5.1

Fixes software-mansion#3553 and software-mansion#3215.
YoussefHenna added a commit to draftbit/react-native-jigsaw that referenced this issue May 28, 2023
YoussefHenna added a commit to draftbit/react-native-jigsaw that referenced this issue Jun 1, 2023
* Preliminary version of linear progress

* Finalized Linear Progress

* Finalized LinearProgress + restrcuture to allow support for indetermintie progress

* Fixed indeterminte mode of linear progress

* Added circular progress component

* Updated variable name

* Fixed SectionList test to use '@testing-library/jest-native'

* Setup tests for progress indicators
- reanimated requires some extra steps to work in jest

* Added test for LinearProgress

* Finalized tests for progress indicators

* Patched rn-reanimted to fix broken tests:
software-mansion/react-native-reanimated#3215

* Updated testing config to allow expo in tests
fluiddot pushed a commit to wordpress-mobile/react-native-reanimated that referenced this issue Jun 5, 2023
…n#3559)

## Description
Reanimated is not fully compatible with Jest 28+ even after the PR software-mansion#3347. Using it with Jest 28+ leads to this error:

<img width="796" alt="Ekran Resmi 2022-09-10 15 00 33" src="https://user-images.githubusercontent.com/22980987/189482337-cc2655f6-9463-4a05-9998-5fc3592f5cc0.png">

The reason is, the "expect" module's export approach has changed starting from Jest 28. It used to export the `expect` function directly, as can be seen [here](https://github.com/facebook/jest/blob/v27.5.1/packages/expect/src/index.ts#L441). 

This means, requiring the "expect" module like this

```ts
const expect = require('expect')
```

was providing direct access to the `expect` function alongside with its attached methods, like `extend`.

This has [changed with Jest 28](https://github.com/facebook/jest/blob/v28.0.0/packages/expect/src/index.ts#L449). `export default expect` is the new export statement, which means requiring the "expect" package returns the module object, instead of the function.

software-mansion#3347 PR attempts to fix this error by assuming "expect" package should throw an error with Jest 28 and it can catch that and require the "expect" from the `@jest/globals` package for Jest 28+ project but it's not the case in reality. "expect" package is still shipped with Jest 28, so, requiring it doesn't throw an error as expected in the PR.

By knowing the export difference, I checked if the value of the module is object or not after requiring it. If it's an object, it means user is on Jest 28+ codebase. The rest is the same with the previous PR. I require the "expect" function from `@jest/globals` and use it.

Tested on Jest 29 and Jest 27.5.1

Fixes software-mansion#3553 and software-mansion#3215.
@Latropos
Copy link
Contributor

Latropos commented Aug 4, 2023

Closing since fix is already merged: #3559

@Latropos Latropos closed this as completed Aug 4, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Missing info The user didn't precise the problem enough Missing repro This issue need minimum repro scenario Needs review Issue is ready to be reviewed by a maintainer
Projects
None yet
Development

Successfully merging a pull request may close this issue.

10 participants