Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@natterstefan
Created February 18, 2020 14:47
Show Gist options
  • Star 27 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save natterstefan/b9748dfe75f8ca177e25e50b3f466e9f to your computer and use it in GitHub Desktop.
Save natterstefan/b9748dfe75f8ca177e25e50b3f466e9f to your computer and use it in GitHub Desktop.
Jest | Mock useState

Jest - mock useState

When using import React, { useState } from 'react' in your components, this is how you can mock useState with jest.

// 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()
})
})
@natterstefan
Copy link
Author

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.

@DamengRandom
Copy link

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?

@natterstefan
Copy link
Author

natterstefan commented Sep 30, 2022

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.

@DamengRandom
Copy link

Thank for help man 👍, I will give it a try.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment