Tests asynchrones avec vœux à l’aide de la bibliothèque http.get dans Node.js

Je ne fais que passer un bon bout de temps à essayer d’obtenir un test http de base pour travailler avec les vœux.

Je pense avoir suivi l’exemple asynchrone des vœux http://vowsjs.org/#-writing-asynchronous-tests et substitué les appels appropriés, mais il me manque quelque chose.

Le code de test ressemble à ceci:

var http = require('http'), vows = require('vows'), assert = require('assert'); vows.describe("homepage").addBatch({ "Get the home page": { topic: function() { http.get({'host': "127.0.0.1", 'port': 5000, 'path': '/'}, this.callback); }, 'should respond with 200 OK': function(res) { assert.equal(res.statusCode, 200); } } }).export(module); 

Je reçois le message d’erreur suivant lorsque j’essaie d’exécuter le test pour ceci:

 /Users//node_modules/vows/lib/vows.js:80 rrored', { type: 'promise', error: err.stack || err.message || JSON.ssortingngify( ^ TypeError: Converting circular structure to JSON at Object.ssortingngify (native) at EventEmitter. (/Users//node_modules/vows/lib/vows.js:80:90) at EventEmitter.emit (events.js:64:17) at /Users//node_modules/vows/lib/vows/context.js:31:52 at ClientRequest. (/Users//node_modules/vows/lib/vows/context.js:46:29) at ClientRequest.g (events.js:143:14) at ClientRequest.emit (events.js:64:17) at HTTPParser.onIncoming (http.js:1349:9) at HTTPParser.onHeadersComplete (http.js:108:31) at Socket.ondata (http.js:1226:22) 

Je peux obtenir un exemple http simple pour travailler seul. Je peux obtenir que l’exemple des vœux fonctionne seul, mais je ne peux pas les combiner pour une raison quelconque. J’apprécierais vraiment de l’aide ici. J’essaie de faire en sorte que cela fonctionne depuis un certain temps maintenant (y compris beaucoup de recherches sur Google).

METTRE À JOUR:

Apparemment, l’ajout d’un argument d’erreur au rappel permet de résoudre ce problème, grâce à l’aide d’Alexis Sellier (créateur des voeux).

Mais je ne sais pas pourquoi. Lors de l’écriture de l’exemple http lib seul, aucun argument d’erreur n’est requirejs. Je ne trouve aucune documentation dans les vœux indiquant pourquoi c’est nécessaire, alors je suis un peu perdue.

Ma nouvelle question est la suivante: pourquoi l’argument d’erreur est-il requirejs lors de l’utilisation de http lib dans les vœux?

Après avoir vérifié le code source de voeu, je pense savoir pourquoi. Les vœux veillent toujours à ce que, lorsque vous appelez this.callback , le premier argument de la fonction récepsortingce résultante soit toujours un object d’erreur. Les voeux interprètent les rappels par ces règles:

  1. Si le premier argument de votre rappel d’origine est un booléen, utilisez-le pour déterminer si un object d’erreur doit être path.exists(boolean) ou non au rappel (ex: path.exists(boolean) émettra un callback(error, exists) ).

  2. Si le premier argument est un object, supposons qu’il s’agisse d’un object d’erreur et l’utilisera pour déterminer si le rappel d’origine doit être ajouté à la liste “erreur” ou “succès”. La raison pour laquelle cette liste existe est pour supporter des tests basés sur des promesses je suppose?

Bien que je ne puisse pas confirmer l’exactitude de ce qui précède, je sais par expérience que le style asynchrone des voeux prend en charge les rappels de style nœud (par exemple, err en tant que premier argument) et que les modules npm tiers qui ne sont pas conformes à cette norme être difficile à tester.

S’il vous plaît ne prenez pas ma réponse comme un évangile, car c’est ma propre expérience. Un autre casse-tête est que vous souhaitez tester des opérations asynchrones à l’intérieur de la fonction. Sans un rappel, les voeux ne pourront pas le gérer correctement.

Personnellement, je pense que les vœux rendent toujours difficile le test du code asynchrone. J’aurais aimé qu’il y ait des fonctions de contrôle de stream waitFor() ou waitFor() .

Ma suggestion? Lorsque vous utilisez du code asynchrone, utilisez Step . Ne laissez pas les vœux contrôler votre stream.

Il manque en fait dans les documentations, ce qui est encore un peu court. Mais vous pouvez en avoir un aperçu ici dans cette page :

 'when peeled *asynchronously*': { topic: function (banana) { banana.peel(this.callback); }, 'results in a `PeeledBanana`': function (err, result) { assert.instanceOf (result, PeeledBanana); } } 

Comme l’ont dit Morten Siebuhr et Ruben Tan, c’est ainsi que fonctionnent les vœux et c’est pourquoi cela fonctionne comme ça.