How to reset or clear a spy in Jest? How to reset or clear a spy in Jest? javascript javascript

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.


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 and mockFn.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.


In case you want to restore the original behavior of a method you had previously added to a spy, you can use the mockRestore method.

Check out the example bellow:

class MyClass {    get myBooleanMethod(): boolean {        return true;    }}const myObject = new MyClass();const mockMyBooleanMethod = jest.spyOn(myObject, 'myBooleanMethod', 'get');// mock myBooleanMethod to return falsemockMyBooleanMethod.mockReturnValue(false);// restore myBooleanMethod to its original behaviormockMyBooleanMethod.mockRestore();