Я тестирую свой GraphQL api с помощью Jest.
Я использую отдельный тестовый костюм для каждого запроса / мутации
У меня есть 2 теста (каждый в отдельном тестовом костюме), где я имитирую одну функцию (а именно, callMethod Meteor), которая используется в мутациях.
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.info(result);
// test logic
expect(callMethod).toBeCalledWith({}, 'forgotPassword', {
email: '[email protected]',
});
// test resolvers
});
Когда я console.info(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 работает нормально ...



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Замените .mockReturnValue на .mockImplementation:
yourMockInstance.mockImplementation(() => {
throw new Error();
});
Если это обещание, вы также можете .rejectsjestjs.io/docs/en/asynchronous#resolves--rejects
здорово. Как с этим справиться, сделать и отстоять?
Для Angular + Jest:
import { throwError } from 'rxjs';
yourMockInstance.mockImplementation(() => {
return throwError(new Error('my error message'));
});
Технически это не throw в чистом смысле JS. Вы настраиваете макет так, чтобы он возвращал наблюдаемый объект RXJS, который немедленно выдает уведомление об ошибке. Тем не менее, это может быть полезно для людей здесь. Принятый ответ, безусловно, будут создает фиктивную ошибку. Во всех случаях.
Достаточно только возврата throw Error: yourMockInstance.mockImplementation(() => throwError('my error message'));
Похоже, ваш макет возвращение - объект ошибки, а не бросание. Не видя вашего кода, который вы тестируете, я могу поделиться только тем опытом, который у меня был. Я забыл издеваться над функцией, вызванной в моей мутации, что привело к непреднамеренной выдаче ошибки. Возможно, с вами происходит что-то подобное?