Pregunta

Estoy teniendo un tiempo de tiempo tratando de obtener una prueba HTTP básica para trabajar con votos.

Creo que he seguido el ejemplo de asíncrono de los votos http://vowsjs.org/#-writing-asynchronous-tests y sustituyó las llamadas apropiadas, pero me falta algo.

El código de prueba se ve así:

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);

Recibo el siguiente error cuando intento ejecutar la prueba para esto:

/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)

Puedo obtener un ejemplo HTTP simple para funcionar por sí mismo. Puedo hacer que el ejemplo de votos funcione por sí mismo, pero no puedo combinarlos por cualquier razón. Realmente apreciaría algo de ayuda aquí. He estado tratando de hacer que esto funcione por un tiempo (incluyendo mucho en Google).

ACTUALIZAR:

Aparentemente, agregar un argumento de error a la devolución de llamada resuelve este problema, gracias a la ayuda de Alexis Sellier (creador de votos).

Pero no tengo idea de por qué. Al escribir el ejemplo HTTP lib en su propio argumento de error. No puedo encontrar ninguna documentación en votos para indicar por qué es necesario, así que tengo un poco de pérdida.

Mi nueva pregunta es ¿por qué se requiere el argumento de error al usar el HTTP LIB en votos?

¿Fue útil?

Solución

Después de verificar el código fuente de Vow, creo que sé por qué. Los votos siempre asegúrese de que cuando llame this.callback, el primer argumento de la función del receptor resultante es siempre un objeto de error. Los votos interpretan las devoluciones de llamada por estas reglas:

  1. Si el primer argumento de su devolución de llamada de origen es un booleano, úselo para determinar si agregar o no un objeto de error a la devolución de llamada receptora (por ejemplo, path.exists(boolean) emitirá callback(error, exists) en cambio)

  2. Si el primer argumento es un objeto, suponga que es un objeto de error y úselo para determinar si agregar la devolución de llamada de origen a la lista de "error" o "éxito". La razón por la que existe esta lista es apoyar las pruebas basadas en promesas, ¿supongo?

Si bien no puedo confirmar que lo anterior es correcto, mi experiencia es que el estilo de asíncea de los votos está hecho para admitir devoluciones de llamada con estilo de nodo (por ejemplo, err como el primer arg) y los módulos de NPM de terceros que no se ajustan a este estándar ser difícil de probar.

Por favor, no tome mi respuesta como evangelio, ya que esta es mi propia experiencia. Otro Gotcha es cuando tiene operaciones de async dentro de la función que desea probar, a menos que proporcione una devolución de llamada, los votos no podrán manejarlo correctamente.

Personalmente, creo que los votos aún dificultan probar el código Async. Ojalá tuviera algo waitFor() o until() Sin embargo, las funciones de control de flujo.

¿Mi sugerencia? Al tratar con el código async, use Paso. No dejes que los votos controlen tu flujo.

Otros consejos

En realidad, falta en las documentos que todavía son un poco cortas. Pero puedes verlo aquí en esta página :

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

Como dijo Morten Siebuhr y Ruben Tan, así es como funcionan los votos y es por eso que funciona así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top