2017-06-09 3 views
0

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.

+1

Haben Sie sich die Dokumentation angesehen? https://facebook.github.io/jest/docs/asynchronous.html –

+0

Um fair zu sein, @FelixKling, diese Dokumente sind nicht großartig, wenn Sie Rückrufe anstelle von Versprechen verwenden. – Paul

+0

@Paul: Nicht sicher, ich verstehe. Was genau meinst du? –

Antwort

0

Ok, also mit etwas Hilfe von @felixKling mir immer die Dokumentation, um tatsächlich lesen, müssen Sie so etwas wie dies tun:

test('Should return a JWT with proper value if nothing wrong happened', done => { 
    issueJWT(request, response, (e) => { 
     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'); 
     done(); 
    }); 
}); 

Ich bin nicht auf meiner Dev-Box, so dass ich dies nicht testen kann, aber im Grunde ist die Idee, dass Sie den Parameter 'done' für den Test-Rückruf verwenden, um zu signalisieren, dass der Test wartet o n Async-Code. Das Testframework wartet im Grunde darauf, dass Ihr Test diesen Callback vor dem Beenden aufruft.

In diesem Fall ist Ihr next() Anruf von issueJWT, was wir auf Feuern warten, bevor Sie überprüfen, ob die verschiedenen Objekte aktualisiert wurden. Wenn Sie in Ihrer Middleware nicht next() verwenden, müssen Sie wahrscheinlich die von Ihnen aufgerufene Antwortmethode (z. B. response.end()) nachahmen, um Ihre Tests durchzuführen.

+0

Danke, es geschafft, das Ergebnis jetzt zu bekommen, das neue Problem ist, dass die Fehlermeldung nicht auf mein Problem bezogen ist ... Irgendein Hinweis dafür? –

+0

Sie sollten wirklich eine andere Frage dazu öffnen. Aber im Allgemeinen ist es genau das, was der Fehler sagt; Der Test dauerte länger als das Standard-Timeout-Intervall.Das bedeutet, dass Sie entweder das Intervall erhöhen oder Ihre Installation überprüfen müssen, um sicherzustellen, dass Sie den Rückruf in allen Codezweigen tatsächlich aufrufen. – Paul

Verwandte Themen