When using import React, { useState } from 'react'
in your components, this is how you can mock useState
with jest
.
-
-
Save natterstefan/b9748dfe75f8ca177e25e50b3f466e9f to your computer and use it in GitHub Desktop.
// 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() | |
}) | |
}) |
// 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() | |
}) | |
}) |
I think @DamengRandom's problem is similar to mine, if your component has more then one useState
, this test is kind of useless, as you don't know which one was called.
I think @DamengRandom's problem is similar to mine, if your component has more then one
useState
, this test is kind of useless, as you don't know which one was called.
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.
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
how about 2 useState?