Ich benutze Jest, um eine Funktion zu testen, die ein JSON Web Token generiert. Es scheint, dass ich den Wert nicht geltend machen kann, da der Callback noch nicht ausgeführt wurde.Wie testen Sie eine Funktion, die einen Rückruf verbraucht? Oder wie man die Behauptung aufschiebt?
const issueJWT = function issueJWT(req, res, next) {
jwt.sign(signUser, function (err, token) {
if (err) {
next(err);
return;
}
res.locals.token = token;
next();
});
};
Dies ist mein Test, verspotten ich die Anfrage und Antwort, dann das Ergebnis behaupten:
test('Should return a JWT with proper value if nothing wrong happened',() => {
issueJWT(request, response, mockNext);
const JWT = response.locals.token;
const tokenPayload = jwt.decode(JWT, { complete: true }).payload;
expect(tokenPayload).toHaveProperty('iat');
expect(tokenPayload).toHaveProperty('exp');
expect(tokenPayload).toHaveProperty('id');
});
Der Fehler ist:
TypeError: Cannot read property 'payload' of null
Wie es funktioniert? Meiner Meinung nach befindet sich der Callback in der Task Queue, was bedeutet, dass ausgeführt wird, wenn nichts in der Event-Schleife ist, oder? Ich möchte einen Weg finden, meine Behauptung aufzuschieben, aber ich weiß nicht wie ...
Danke für die Tipps, ich benutze die done
, jetzt könnte der Test bestanden werden, aber das Problem ist, wenn es ein Problem gibt, die Fehlermeldung macht keinen Sinn ... Irgendwelche Probleme mit meiner Lösung?
test('Should return a JWT with proper value if nothing wrong happened', (done) => {
const callback =() => {
const JWT = response.locals.token;
const tokenPayload = jwt.decode(JWT, { complete: true }).payload;
expect(tokenPayload).toHaveProperty('iat');
expect(tokenPayload).toHaveProperty('exp');
expect(tokenPayload).toHaveProperty('id');
expect(tokenPayload).toHaveProperty('iss');
done();
};
issueJWT(request, response, callback);
});
Der Fehler ist nun:
Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
Haben Sie sich die Dokumentation angesehen? https://facebook.github.io/jest/docs/asynchronous.html –
Um fair zu sein, @FelixKling, diese Dokumente sind nicht großartig, wenn Sie Rückrufe anstelle von Versprechen verwenden. – Paul
@Paul: Nicht sicher, ich verstehe. Was genau meinst du? –