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.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() {
...
UPDATE
.mockReturnValue
を.mockImplementation
に置き換えたとき、すべてが期待どおりに機能しました。
callMethod.mockImplementation(() => {
throw new Error('User not found');
});
しかし、それは別のテストで.mockReturnValue
がうまく機能する理由を説明しません...
.mockReturnValue
を.mockImplementation
で変更:
yourMockInstance.mockImplementation(() => {
throw new Error();
});