-
-
Notifications
You must be signed in to change notification settings - Fork 6.5k
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.mock does not mock an ES module without Babel #10025
Comments
Copied from #9430 (comment) at the request of @SimenB. Thanks! |
I respectfully disagree with this being labeled a feature request. It's entirely blocking of any effort to move to Jest native ES module support if any files have mocks in them, and there is no workaround that I know of (other than to continue using CommonJS through Babel, which means that ES module support is broken, hence bug). |
I started working on this, and I think it makes sense to leave Also need to figure out |
@aldeed @SimenB Hello, I'm also having the same problem, but when I try to use jest with babel instead, I'm running into Is there any workaround to mock modules from the same project? Or to prevent the |
@guilhermetelles It can be a pain to do, but you'll likely get more help if you create a public minimal reproduction repo for your issue and create a new GH issue that references this one. There are about a dozen things that could cause this issue, from using an older Node version to Babel config issues, and being able to see all the project files is the best way for someone to help you solve it. @SimenB You mentioned above that you had a start on this and it looks like everyone 👍 your proposal. Is there any update? |
One thing to note is that it will be impossible to mock import { jest } from '@jest/globals';
jest.mockModule('someModule', async () => ({ foo: 'bar' }));
let someModule;
beforeAll(async () => {
someModule = await import('someModule');
});
test('some test', () => {
expect(someModule.foo).toBe('bar');
}); It will be a bit cleaner with top-level import { jest } from '@jest/globals';
jest.mockModule('someModule', async () => ({ foo: 'bar' }));
const someModule = await import('someModule');
test('some test', () => {
expect(someModule.foo).toBe('bar');
}); Any modules loaded by The example in the OP follows this pattern, I'm just pointing it out 👍 |
@SimenB this is my first comment in this repo, so the first words unambiguously look like - great work! We're in one step from transitioning of our infrastructure into ESM. The only things left are tests. We're planning to actively use top level await in our code base and there is an obstacle because we're ready to compile our code to ESNext (in terms of TS) but most of our tests use After closing #9860 by #10823 there is one important topic left considering original list in #9430 - support of Can You explain the current status of the issue?! I mean:
Thanks in advance. |
I want to add |
As a status update, I've opened up a PR here: #10976 |
@SimenB before your PR gets merged, what is the work-around solution here? |
@anshulsahni no workaround, apart from rewriting your code to not use mocking for the moment with the esm modules |
yeah, there is not workaround if you wanna use native ESM until that lands |
right now I'm using babel & it's configured to only convert esm modules. So the whole app runs in esm modules but tests run with commonjs module system |
yep, that'll keep working |
I'm looking forward for this feature 👍 |
you can show me your config please? my apps runs in esm modules and I need run my test with commonjs modules |
Create a minimal reproduction repo and open an issue. It is hard to say something useful looking at the snipped you provided. |
So, what I see here is that your default entry is not an object, it's a key pointing directly to the function, can you try doing it like this: Also, for it to work, you need to than import this function with await statement after the mock was done, not using the normal import statement at the top of the file |
@Nexi77 Code:
And still call original helper function which call 3rd party, instead to use |
@IgorBezanovic I just experienced the same issue you had; here's how I fixed it.
the trick was in before:
after:
|
I've been banging my head against a wall, and I'm hoping that maybe you can help! I am trying to mock the ora library. These are the libraries installed: {
"name": "demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"jest": "^29.7.0"
},
"dependencies": {
"ora": "^8.0.1"
}
} I've set up a barebones project to try and get this to work. The directory structure is:
import ora from 'ora';
export default (options) => {
const spinner = !options.raw ? ora('Reading Environment Variables').start() : undefined;
spinner.succeed(`Environment Variables Retrieved`);
return true;
};
jest.unstable_mockModule('ora', () => ({
default: { start: jest.fn(), succeed: jest.fn() },
}));
const src = import('../config');
describe('...', () => {
it('ora is mocked', () => {
const actual = config({})
expect(actual).toBeUndefined() // Yes, I realize this is a terrible and incorrect unit test.
})
}) When I run
|
@mike-weiner what happens if you add type: module in your package.json ? |
Interesting. I do get a slightly different error:
|
A few additional tweaks to
@skilbjo - You are a life saver. Don't event want to say how many hours I've been wrangling with this. |
cool, you’re almost there. to the top of your config.test.js file, as documented in the ESMAScript modules jest docs page |
One last follow up for you. The following results in
However, this works fine:
I should be able to call my |
I am hitting the following error:
|
i think we need
run that both in normal mode but i think what is needed to get it to work for you is something like:
you can fill me in with what you find, i have just got it working for myself today and am not sure all the workarounds etc yet. do let me know ... |
The jest.unstable_mockModule('ora', () => ({
default: () => ({
start: oraStartMock,
succeed: oraSucceedMock,
})
})); But I don't think issues on how to mock specific libraries is something that should be discussed in this issue tracker. |
@mx-bernhard - Yes, my bad. Is there a community page that is better suited for general questions? |
@mike-weiner I don't know anything else other than Discord / SO, as mentioned here: https://jestjs.io/help |
Is there a way to unmock modules set up with I've tried const actualModule = await import('something');
jest.unstable_mockModule('something', () => {...});
// Do tests, then "restore" the implementation
const mockedModule = await import('something');
mockedModule.default.mockImplementation(actualModule.default); |
Try upgrading Jest. There was an issue with |
@mrazauskas Thanks - I'm currently on the latest |
I am upgrading the jests using es module.
I tried to use above code, but getting timeout issue. |
@akdev5 - I don't think you need the |
I tried to call without async. but seems not working. |
@akdev5 - Let's take this conversation somewhere else since it's not related to this issue. Maybe open a Stack Overflow issue and include as much detail and code snippets as you can and others might be able to help too! |
Additionally use the `keep-alive` setting of fetch to ensure delivery of events even when the page may be closing. Also better encapsulating browser APIs to ensure that the SDK can operate smoothly in service workers and browser extensions. Also set browser appropriate flush interval. Currently no testing for the state detector because of: jestjs/jest#10025 I think we need to switch to a babel based Jest setup to get things working better. So far Jest has not been a pleasant experience for ESM.
🐛 Bug Report
In an ES module Node project, with no Babel,
jest.mock
works when the mocked module is anode_modules
package that exports CommonJS, but it isn't working for me mocking an ES module exported from a file in the same project.(It's possible that an NPM package that only exports ES modules has the same issue. I didn't try that case.)
To Reproduce
Steps to reproduce the behavior:
Click Run in the repl, or here's a simple example:
Expected behavior
jest.mock(filename)
should mock the exports fromfilename
when the test file and the Node project are both ES modules (type: "module"
)Link to repl or repo (highly encouraged)
https://repl.it/repls/VerifiableOfficialZettabyte
envinfo
The text was updated successfully, but these errors were encountered: