How to reset or clear a spy in Jest?
Thanks to @sdgluck for the answer, though I would like to add to this answer that in my case, I wanted a clear state after each tests since I have multiple tests with same spy. So instead of calling the mockClear()
in previous test(s), I moved it into the afterEach()
(or you can use it with beforeEach
) like so:
afterEach(() => {
jest.clearAllMocks();
});
And finally, my tests are working like they should without the spy being called from previous test. You can also read their documentation for it
Option 2
If you wish to do it from a global level, you could also updated your jest.config.js
(or from package.json
)
module.exports = {
clearMocks: true,
// ...
}
You can read Jest documentation about it
Jest spies have the same API as mocks. The documentation for mocks is here and specifies a method mockClear
which:
Resets all information stored in the
mockFn.mock.calls
andmockFn.mock.instances
arrays.Often this is useful when you want to clean up a mock's usage data between two assertions.
(emphasis my own)
So we can use mockClear
to "reset" a spy. Using your example:
const methods = {
run: () => {}
}
const spy = jest.spyOn(methods, 'run')
describe('spy', () => {
it('runs method', () => {
methods.run()
expect(spy).toHaveBeenCalled() //=> true
/* clean up the spy so future assertions
are unaffected by invocations of the method
in this test */
spy.mockClear()
})
it('does not run method', () => {
expect(spy).not.toHaveBeenCalled() //=> true
})
})
Here is an example in CodeSandbox.