Ich teste meine GraphQL-API mit Jest.
Ich verwende für jede Abfrage / Mutation einen separaten Testanzug
Ich habe 2 Tests (jeder in einem separaten Testanzug), bei denen ich eine Funktion (nämlich Meteor callMethod
) verspotte , die bei Mutationen verwendet wird.
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
});
Wenn console.log(result)
ich bekomme
{ data: { forgotPassword: true } }
Dieses Verhalten ist nicht das, was ich will , weil in .mockReturnValue
ich einen Fehler aus , und daher erwarten , result
ein Fehlerobjekt haben ,
Vor diesem Test wird jedoch ein anderer ausgeführt
it('should throw an error if wrong credentials were provided', async () => {
callMethod
.mockReturnValue(new Error('cannot login'))
.mockName('callMethod');
Und es funktioniert gut, der Fehler wird geworfen
Ich denke, das Problem ist, dass Mock nach Abschluss des Tests nicht zurückgesetzt wird. In meinem jest.conf.js
habe ich clearMocks: true
Jeder Testanzug befindet sich in einer separaten Datei, und ich verspotte Funktionen vor Tests wie diesen:
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() {
...
AKTUALISIEREN
Als ich .mockReturnValue
mit .mockImplementation
allem ersetzte, hat alles wie erwartet geklappt:
callMethod.mockImplementation(() => {
throw new Error('User not found');
});
Aber das erklärt nicht, warum in einem anderen Test gut .mockReturnValue
funktioniert ...
quelle
Antworten:
Ändern
.mockReturnValue
mit.mockImplementation
:yourMockInstance.mockImplementation(() => { throw new Error(); });
quelle
.rejects
jestjs.io/docs/en/asynchronous#resolves--rejectsFür Angular + Jest:
import { throwError } from 'rxjs'; yourMockInstance.mockImplementation(() => { return throwError(new Error('my error message')); });
quelle
throw
reiner JS-Sinne. Sie konfigurieren den Mock so, dass er ein beobachtbares RXJS-Objekt zurückgibt, das sofort eine Fehlerbenachrichtigung ausgibt. Trotzdem vielleicht praktisch für Leute, die hier sehen können. Die akzeptierte Antwort sicherlich wird ein Mock macht einen Fehler aus. Auf alle Fälle.