web-dev-qa-db-ja.com

Jestでモックにエラーを適切にスローさせる方法は?

Jestを使用してGraphQL APIをテストしています。

私はクエリ/突然変異ごとに別々のテストスーツを使用しています

突然変異で使用される1つの関数(つまり、MeteorのcallMethod)をモックする2つのテスト(それぞれ個別のテストスーツ)があります。

  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
  });

console.log(result)を取得すると

{ data: { forgotPassword: true } }

.mockReturnValueでエラーをスローし、したがってresultにエラーオブジェクトがあることを期待するため、この動作は私が望むものではありません

ただし、このテストの前に、別のテストが実行されます

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

そして、それはうまく動作し、エラーがスローされます

問題は、テスト終了後にモックがリセットされないことだと思います。 jest.conf.jsclearMocks: trueがあります

各テストスーツは個別のファイルにあり、次のようなテストの前に関数をモックします。

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

.mockReturnValue.mockImplementationに置き換えたとき、すべてが期待どおりに機能しました。

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

しかし、それは別のテストで.mockReturnValueがうまく機能する理由を説明しません...

29
Le garcon

.mockReturnValue.mockImplementationで変更:

yourMockInstance.mockImplementation(() => {
  throw new Error();
});
46
eduardomoroni