Comment tester un talon de retour d'une promesse dans un async test?
Comment puis-je tester cela dans une manière asynchrone?
it('Should test something.', function (done) {
var req = someRequest,
mock = sinon.mock(response),
stub = sinon.stub(someObject, 'method');
//returns a promise
stub.withArgs('foo').returns(Q.resolve(5));
mock.expects('bar').once().withArgs(200);
request(req, response);
mock.verify();
});
Et voici la méthode à tester.
var request = function (req, response) {
...
someObject.method(someParameter)
.then(function () {
res.send(200);
})
.fail(function () {
res.send(500);
});
};
Comme vous pouvez le voir, je suis en utilisant node.js Q (la promesse), sinon pour les objets fantaisie et de moka que l'environnement de test. Le test ci-dessus échoue à cause de la async comportement de la demande de la méthode et je ne sais pas quand faire appel done() dans le test.
Façon la plus simple que j'ai trouvé dans le travail avec les appels asynchrones, lorsque vous souhaitez utiliser la réponse, était de sortir de la fonction en 2, au point où la réponse est nécessaire et l'appel de la deuxième partie lors de la réception de la réponse.
vous devez choisir une réponse, et pas seulement upvote.
vous devez choisir une réponse, et pas seulement upvote.
OriginalL'auteur Stefan | 2013-04-15
Vous devez vous connecter pour publier un commentaire.
Vous devez appeler fait une fois toutes les opérations asynchrones ont fini. Quand pensez-vous que ce serait? Comment voulez-vous normalement attendre jusqu'à ce qu'une demande n'est pas terminée?
Il pourrait également être une bonne idée pour marquer votre test comme d'échouer dans un errorcallback joint à la demande de la promesse.
Peut-être le coeur de ce problème ne venait pas tranquille bon. J'ai l'habitude de rendement de la fonction de rappel de someObject.méthode comme
stub.withArgs('foo').yields(5)
. Dans ce cas, la fonction de rappel est d'obtenir immédiatement exécuté. Mais maintenant, avec les promesses, je n'retour différé de l'objet et de le résoudre et de rejeter gestionnaire appelé à la fin, car la méthode de la requête est déjà terminé. À cet effet les objets fantaisie avais pas vérifié. Si j'enveloppe le vérifier méthode dans un setTimeout avec un appel à faire avec elle, le test passe.setTimeout(function () { mock.verify(); done(); }, 100)
Hmm, dans mon expérience, c'est une bonne pratique pour les méthodes asynchrones pour fournir un moyen de savoir quand ils vont compléter - pour ce faire, vous pouvez soit accepter un paramètre de rappel, ou le retour d'une promesse. Selon la méthode que vous utilisez, vous pouvez appeler la "fin de l'essai" de code.
Vous avez raison, si je veux utiliser la promesse tenue et puis j'ai besoin pour mettre en œuvre les réponses de la méthode d'envoi avec un appel à l'accompli. Mais dans ce cas je peux oublier d'utiliser se moque de...
OriginalL'auteur David McMullin
Solution de travail en caractères d'imprimerie:
OriginalL'auteur Łukasz Rzeszotarski