Estoy probando mi API GraphQL usando Jest.
Estoy usando un traje de prueba separado para cada consulta/mutación
Tengo 2 pruebas (cada una en un traje de prueba separado) donde me burlo de una función (a saber, callMethod de Meteor) que se usa en mutaciones.
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: 'user@example.com' }; const result = await simulateQuery({ query, params }); console.log(result); // test logic expect(callMethod).toBeCalledWith({}, 'forgotPassword', { email: 'user@example.com', }); // test resolvers }); Cuando console.log(result) obtengo
{ data: { forgotPassword: true } } Este comportamiento no es lo que quiero porque en .mockReturnValue lanzo un error y, por lo tanto, espero que el result tenga un objeto de error
Antes de esta prueba, sin embargo, se ejecuta otra
it('should throw an error if wrong credentials were provided', async () => { callMethod .mockReturnValue(new Error('cannot login')) .mockName('callMethod');Y funciona bien, se lanza el error.
Supongo que el problema es que el simulacro no se reinicia después de que finaliza la prueba. En mi jest.conf.js tengo clearMocks: true
Cada traje de prueba está en un archivo separado, y me burlo de las funciones antes de las pruebas como esta:
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() { ...ACTUALIZAR
Cuando sustituí .mockReturnValue con .mockImplementation todo salió como se esperaba:
callMethod.mockImplementation(() => { throw new Error('User not found'); }); Pero eso no explica por qué en otra prueba .mockReturnValue funciona bien...
Cambie .mockReturnValue con .mockImplementation :
yourMockInstance.mockImplementation(() => { throw new Error(); });por si quieres afirmar
test('the fetch fails with an error', () => { return expect(fetchData()).rejects.toMatch('error'); });Si es una promesa, también puede .rechazar www.jestjs.io/docs/en/asynchronous#resolves--rejects
Para promesas, puede usar https://jestjs.io/docs/mock-function-api#mockfnmockrejectedvaluevalue
test('async test', async () => { const asyncMock = jest.fn().mockRejectedValue(new Error('Async error')); await asyncMock(); // throws "Async error" });Para probar si se produjo un error o no, puede usarhttps://eloquentcode.com/expect-a-function-to-throw-an-exception-in-jest
const func = () => { throw new Error('my error') } it('should throw an error', () => { expect(func).toThrow() })Para Angular + broma:
import { throwError } from 'rxjs'; yourMockInstance.mockImplementation(() => { return throwError(new Error('my error message')); });