npmmeteor95% confidence\u2191 224

How to properly make mock throw an error in Jest?

Full error message
I'm testing my GraphQL api using Jest.

I'm using a separate test suit for each query/mutation

I have 2 tests (each one in a separate test suit) where I mock one function (namely, Meteor's callMethod) that is used in mutations.

  it('should throw error if email not found', async () => {
    callMethod
      .mockReturnValue(new Error('User not found [403]'))
      .mockName('callMethod');

    const query = FORGOT_PASSWORD_MUTATION;
    const params = { email: '[email protected]' };

    const result = await simulateQuery({ query, params });

    console.log(result);

    // test logic
    expect(callMethod).toBeCalledWith({}, 'forgotPassword', {
      email: '[email protected]',
    });

    // test resolvers
  });

When I console.log(result) I get       

{ data: { forgotPassword: true } }

This behaviour is not what I want because in .mockReturnValue I throw an Error and therefore expect result to have an error object

Before this test, however, another is ran

 it('should throw an error if wrong credentials were provided', async () => {
    callMethod
      .mockReturnValue(new Error('cannot login'))
      .mockName('callMethod');

And it works fine, the error is thrown

I guess the problem is that mock doesn't get reset after the test finishes.
In my jest.conf.js I have   clearMocks: true

Each test suit is in a separate file, and I mock functions before tests like this:

import simulateQuery from '../../../helpers/simulate-query';

import callMethod from '../../../../imports/api/users/functions/auth/helpers/call-accounts-method';

import LOGIN_WITH_PASSWORD_MUTATION from './mutations/login-with-password';

jest.mock(
  '../../../../imports/api/users/functions/auth/helpers/call-accounts-method'
);

describe('loginWithPassword mutation', function() {
...

UPDATE

When I substituted .mockReturnValue with .mockImplementation everything worked out as expected:

callMethod.mockImplementation(() => {
  throw new Error('User not found');
});

But that doesn't explain why in another test .mockReturnValue works fine...

Change .mockReturnValue with .mockImplementation: yourMockInstance.mockImplementation(() => { throw new Error(); }); in case you want to assert test('the fetch fails with an error', () => { return expect(fetchData()).rejects.toMatch('error'); }); If it's a promise you can also to .rejects www.jestjs.io/docs/en/asynchronous#resolves--rejects

API access

Get this solution programmatically \u2014 free, no authentication.

curl https://depscope.dev/api/error/a1714ef2bc0a2ed28de393f4b0bc0dd93fc21221ee311d2c9b6348a11f2ca18c
hash \u00b7 a1714ef2bc0a2ed28de393f4b0bc0dd93fc21221ee311d2c9b6348a11f2ca18c
How to properly make mock throw an error in Jest? — DepScope fix | DepScope