Question

Je vais avoir un doozie d'un temps à essayer d'obtenir un test HTTP de base au travail avec des vœux.

Je pense que j'ai suivi l'exemple async de vœux http://vowsjs.org/# -Rédaction-tests asynchrones et les appels appropriés substitué, mais je dois manquer quelque chose.

Le look de code de test comme celui-ci:

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 l'erreur suivante lorsque je tente de lancer le test pour cela:

/Users/<home_folder>/node_modules/vows/lib/vows.js:80
rrored', { type: 'promise', error: err.stack || err.message || JSON.stringify(
                                                                    ^
TypeError: Converting circular structure to JSON
    at Object.stringify (native)
    at EventEmitter.<anonymous> (/Users/<home_folder>/node_modules/vows/lib/vows.js:80:90)
    at EventEmitter.emit (events.js:64:17)
    at /Users/<home_folder>/node_modules/vows/lib/vows/context.js:31:52
    at ClientRequest.<anonymous> (/Users/<home_folder>/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 simple http au travail sur son propre. Je peux obtenir l'exemple de vœux au travail sur son propre mais je ne peux pas les combiner pour une raison quelconque. Je vous en serais reconnaissant de l'aide ici. J'ai essayé d'obtenir ce au travail pendant un certain temps maintenant (y compris googler beaucoup).

Mise à jour:

Il semble que l'ajout d'un argument d'erreur à l'arrière d'appel permet de résoudre ce problème, grâce à l'aide d'Alexis Sellier (créateur de vœux).

Mais je ne sais pas pourquoi. Lors de l'écriture sur l'exemple http lib sur son propre aucun argument d'erreur est nécessaire. Je ne peux pas trouver toute la documentation de vœux pour indiquer pourquoi il est nécessaire, donc je suis un peu de perte.

Ma nouvelle question est pourquoi l'argument d'erreur requis lors de l'utilisation du http lib dans vœux?

Était-ce utile?

La solution

Après avoir vérifié le code source de voeu, je pense que je sais pourquoi. Assurez-vous toujours que Vows lorsque vous appelez this.callback, le premier argument de la fonction du récepteur résultant est toujours un objet d'erreur. Interpréter les vœux callbacks par ces règles:

  1. Si le premier argument de votre rappel d'origine est un booléen, utiliser pour déterminer si oui ou non à ajouter un objet d'erreur au rappel de réception (par exemple path.exists(boolean) émettra callback(error, exists) au lieu)

  2. Si le premier argument est un objet, on suppose qu'il est un objet d'erreur et l'utiliser pour déterminer si pour ajouter le rappel d'origine à la « erreur » ou la liste « succès ». La raison pour laquelle cette liste existe est de soutenir des tests à base de promesse que je suppose?

Alors que je ne peux pas confirmer ce qui précède est exact, mon expérience est que les vœux async style est fait pour soutenir callbacks style nœud (par exemple err comme le premier arg), et 3 modules NPM partie qui ne se conforment pas à cette norme sera difficile à tester.

S'il vous plaît ne prenez pas ma réponse comme parole d'évangile, car cela est ma propre expérience. Une autre Gotcha est quand vous avez des opérations asynchrones dans la fonction que vous souhaitez tester. - sauf si vous fournissez un rappel, les vœux ne seront pas en mesure de gérer correctement

Personnellement, je pense que les vœux font encore du mal à l'essai le code async. Je voudrais qu'il avait des waitFor() ou des fonctions de contrôle de flux until() cependant.

Ma suggestion? Lorsque vous traitez avec le code async, utilisez étape . Ne laissez pas contrôler votre vœux flux.

Autres conseils

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

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

Comme il a été dit par Morten Siebuhr et Ruben Tan, voici comment fonctionne de vœux et qui est la raison pour laquelle cela fonctionne comme ça.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top