Я тестирую свой GraphQL api, используя Jest.
Я использую отдельный тест для каждого запроса/мутации
У меня есть 2 теста (каждый в отдельном тестовом костюме), где я макет одной функции (а именно 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
я бросаю ошибку и поэтому ожидаю, что 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
отлично работает...