When using import React, { useState } from 'react'
in your components, this is how you can mock useState
with jest
.
Created
February 18, 2020 14:47
-
-
Save natterstefan/b9748dfe75f8ca177e25e50b3f466e9f to your computer and use it in GitHub Desktop.
Jest | Mock useState
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// source: https://dev.to/ppciesiolkiewicz/comment/i708 | |
import React, { useState as useStateMock } from 'react' | |
import { mount } from 'enzyme' | |
// Header uses `useState` | |
import { Header } from '..' | |
jest.mock('react', () => ({ | |
...jest.requireActual('react'), | |
useState: jest.fn(), | |
})) | |
describe('Header', () => { | |
const setState = jest.fn() | |
beforeEach(() => { | |
useStateMock.mockImplementation(init => [init, setState]) | |
}) | |
it('renders', () => { | |
const wrapper = mount( | |
<Header /> | |
) | |
expect(setState).toHaveBeenCalledTimes(1) | |
expect(wrapper).toBeTruthy() | |
}) | |
}) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// source: https://dev.to/ppciesiolkiewicz/comment/i708 | |
import React, { useState as useStateMock } from 'react' | |
import { mount } from 'enzyme' | |
// Header uses `useState` | |
import { Header } from '..' | |
jest.mock('react', () => ({ | |
...jest.requireActual('react'), | |
useState: jest.fn(), | |
})) | |
describe('Header', () => { | |
const setState = jest.fn() | |
beforeEach(() => { | |
;(useStateMock as jest.Mock).mockImplementation(init => [init, setState]) | |
}) | |
it('renders', () => { | |
const wrapper = mount( | |
<Header /> | |
) | |
expect(setState).toHaveBeenCalledTimes(1) | |
expect(wrapper).toBeTruthy() | |
}) | |
}) |
Hi @natterstefan, when we have used 2 useState in one component, how can we do the unit test?
The example you have shown above only satisfies with 1 useState unit test if I am not mistaken, but sometime we do need to test 2 useState cases, right?
Hi @DamengRandom,
I think https://stackoverflow.com/a/71712376/1238150 or https://stackoverflow.com/a/65334852/1238150 might work, but I haven't tested it further. I suggest you look into it yourself as I am currently less able to deal with it. Sorry.
Thank for help man ๐, I will give it a try.
I can confirm that the second link from @natterstefan works for me. Don't forget the
.mockImplementation((x) => [x, () => null]); // ensures that the rest are unaffected
part to ensure all useState
mocked in case you forget one
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Ah, that's what @DamengRandom was talking about. Sorry, I guess I was thinking too complicated. ๐
Okay, so this is probably doable but not without flaws as discussed here on stackoverflow for instance.