1. ホーム
  2. javascript

[解決済み] Jestでモックがエラーを投げるようにするにはどうしたらいいですか?

2022-03-06 11:50:35

質問

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

各クエリ/ミューテーションに個別のテストスイートを使用しています。

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

  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 Errorを投げるので result はエラーオブジェクトを持つ

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

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

そして、それは正常に動作し、エラーがスローされます

テスト終了後にモックがリセットされないのが問題なんだろう。 私の jest.conf.js 私は clearMocks: 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() {
...

アップデイト

を代入したところ .mockReturnValue.mockImplementation は、すべて期待通りに動作しました。

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

しかし、それではなぜ別のテストでは .mockReturnValue は正常に動作するのですが・・・。

解決方法は?

変更 .mockReturnValue.mockImplementation :

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

プロミスであれば、.rejectsも可能です。 www.jestjs.io/docs/en/asynchronous#resolves--rejects