Quel est le point de le faire (les) de rappel?
Dans Mochajs, ils utilisent des "done()" pour tester le code asynchrone, comme suit:
describe('User', function() {
describe('#save()', function() {
it('should save without error', function(done) {
var user = new User('Luna');
user.save(function(err) {
if (err) throw err;
done();
});
});
});
});
Qu'est-ce que cela signifie exactement? J'ai fait de la console.journal(le fait.toString()) et j'ai obtenu ceci:
function (err) {
if (err instanceof Error || toString.call(err) === '[object Error]') {
return done(err);
}
if (err) {
if (Object.prototype.toString.call(err) === '[object Object]') {
return done(new Error('done() invoked with non-Error: '
+ JSON.stringify(err)));
}
return done(new Error('done() invoked with non-Error: ' + err));
}
done();
}
Est le fait de() à la fin ici différente de la() dans le premier morceau de code?
Dans la première partie de code
Le framework de test doit savoir à quel moment l'opération asynchrone est terminée, il peut vérifier que le test réussi. De sorte qu'il vous donne un
done()
se réfère à la done
paramètre. Dans la deuxième partie du code done()
se réfère à la définition de la done()
trouve dans le champ d'application actuel.Le framework de test doit savoir à quel moment l'opération asynchrone est terminée, il peut vérifier que le test réussi. De sorte qu'il vous donne un
done()
fonction de ce que vous appelez de le faire savoir.OriginalL'auteur PraneethVT | 2016-06-05
Vous devez vous connecter pour publier un commentaire.
Moka est capable de gérer synchrone et asynchrone des tests. Lorsque vous exécutez une synchrone de test, vous pouvez simplement passer comme une fonction anonyme pour
it
et vous n'avez pas à faire autre chose: Moka le sait, le test est terminé lorsque la fonction retourne. Cependant, si vous êtes en cours d'exécution asynchrone de test, vous avez à dire à Moka que le test est asynchrone. Il y a deux façons de le faire:Déclarer que la fonction anonyme, vous passez à
it
prend un paramètre. Moka appelle votre fonction anonyme avec un seul paramètre qui est une fonction, vous devez appeler pour indiquer que le test est plus. (Ce paramètre est appelédone
en raison de la tradition. On pourrait appeler celacomplete
,cb
ouplatypus
et cela fonctionne tout de même.) Si vous appelezdone
sans valeur, le test est réussi. Avec une valeur, le test est un échec, et la valeur doit être unError
objet ou un objet dérivé deError
.Retour d'une promesse: Moka va attendre la promesse d'être résolu ou rejeté. Si résolu, le test est réussi. Si la demande est rejetée, le test a échoué.
Le code que vous voyez lorsque vous ne
done.toString()
est juste le code de la fonction qui Moka passe de votre test lorsque vous déclarer qu'il prenne un paramètre. Vous pouvez le voir dans certains de ce que j'ai mentionné ci-dessus (par exemple, si vous passez un paramètre àdone
il devrait être unError
ou dérivés deError
). Ledone
dans il y a un autredone
fonction de ce qui est privé à Moka.OriginalL'auteur Louis
En raison de la nature asynchrone de node.js, vous avez à dire à Moka que vous avez terminé votre test.
Pour synchrones classiques langues, vous avez terminé lorsque la méthode est terminée. Mais dans le nœud, d'abord l'ensemble de la méthode est exécutée et puis, quelque temps après est exécutée à l'intérieur du corps de
user.save()
.Le Moka juste en attente de test jusqu'à ce que
done()
, est appelé, parce qu'il n'ont pas une autre option pour trouver si quelque chose d'autre doit être exécutée ou que c'est fini.La sortie que vous avez est juste le corps de la fonction
done
.OriginalL'auteur libik
Tous les cas de test, y compris avant(), après(), beforeEach(), afterEach() doit appeler done() à la fin pour dire moka que toutes les tâches sont terminées.
Si done() est manquant, délai d'attente si une exception se produit en raison de moka va attendre des "() " jusqu'à ce délai d'attente.
puis-je voir votre exemple de code? de mes expériences, avant de(), après(), beforeEach(), afterEach (), () doit avoir fait() à la fin
les rappels avant, après et ainsi de suite sont comme "normal" moka tests. ils peuvent avoir soit un fait de rappel ou non. si elles sont présentes dans les fonctions de la liste d'arguments, de moka expire si done() n'est pas appelée, sinon, elle se termine juste après le dernier appel de la fonction. C'est une exception, si votre test renvoie une promesse - puis moka permettra de résoudre cette promesse...
OriginalL'auteur Alongkorn Chetasumon