Pregunta

Intento ponerme al día con node.js y nodeunit, pero encuentro un problema con nodeunit donde no ve la llamada a test.done() en una de las pruebas.

El código:

// Added for clarity.
var client = require("restify").createJsonClient({
    "version": "*",
    "url": "http://localhost:" + server.Port
});

exports["tests"] = {
    "setUp": function (callback) {
        server.StartServer();
        callback();
    },
    "tearDown": function (callback) {
        callback();
    },
    "CanIHaveSomeTeaPlease?": function (test) {
        test.expect(4);
        client.get("/tea", function (err, req, res, data) {
            test.equal(err.statusCode, 418, "Expected ImATeapot Error.");
            test.equal(err.message, "Want a biscuit?", "Expected to be asked if I want a buscuit.");
            test.equal(err.restCode, "ImATeapotError");
            test.equal(err.name, "ImATeapotError");
            test.done();
        });
    },

    // Note: I expect this test to fail as it is a copy of the above
    //       test on a different url that doesn't return the ImATeapot
    //       HTTP error. But it doesn't look like it's detecting it
    //       properly.

    "TakeThisInfo": function (test) {
        test.expect(4);
        client.put("/push", {
            "hello": "world"
        }, function (err, req, res, data) {
            test.equal(err.statusCode, 418, "Expected ImATeapot Error.");
            test.equal(err.message, "Want a biscuit?", "Expected to be asked if I want a buscuit.");
            test.equal(err.restCode, "ImATeapotError");
            test.equal(err.name, "ImATeapotError");
            test.done();
        });
    }
};

Producción:

FAILURES: Undone tests (or their setups/teardowns):
- tests - TakeThisInfo

To fix this, make sure all tests call test.done()

Espero que sea algo estúpido.

Versiones: -

Node: 0.10.21
NPM: 1.3.11
Nodeunit: 0.8.2
Grunt-CLI: 0.1.10
Grunt: 0.4.1
¿Fue útil?

Solución

Primero, no sé qué es el "servidor" en su código, pero esperaría que sea asíncrono, por lo que tener algo más como este en su función de configuración:

function (callback) {
  server.StartServer(function(){
    callback();
  });
}

Segundo, mantenga presente esa unidad de nodo ejecuta el inicio y las funciones de desmontaje después y antes de cada prueba Así que sospecho que está comenzando su servidor 2 veces (como en el desmontaje, realmente no lo está cerrando).

Otros consejos

He pasado las últimas horas solucionando este problema y lo que ha quedado claro es que nodeunit no tiene la capacidad de detectar y mostrar excepciones lanzadas en funciones que se activan más tarde mediante un proceso de tipo IO o setTimeout.Teniendo en cuenta la forma en que se ejecuta JavaScript, esto no es sorprendente.Todo funciona una vez que estás seguro de que no hay excepciones, pero si tienes un error en tu código, recibirás el mensaje "pruebas deshechas" y nada más.Esto es lo que hice para resolver mis problemas (usando una ruta de restificación como ejemplo):

function myRoute(req, res, next) {
    try {
        // your code goes here...
    }
    catch (err) {
        // write it to the console (for unit testing)
        console.log(err);
        // pass the error to the next function.
        next(err);
    }
}

Una vez que entendí el problema de esta manera, lo solucioné porque quedó mucho más claro y pude aprobar todas mis pruebas.

Sospecho que en realidad no estás llamando test.done() en esa segunda prueba. Poner un console.log() Llame allí para verificar que realmente esté haciendo esa llamada.

FWIW, reproduje el problema descrito usando una versión simplificada de su prueba, a continuación. Si omite el on('error', function() {...}) manejador, entonces la segunda prueba no se completa. Por lo tanto, mi teoría es que tu /push El punto final está desencadenando un comportamiento diferente en el módulo Restify. Es decir, eres tu Por supuesto Restify es invocar su devolución de llamada con un err Propiedad allí, ¿o está haciendo algo diferente? ... como, por ejemplo, emitiendo un evento como http.get lo hace, abajo.

var http = require('http');

exports.test1 = function (test) {
  test.expect(1);
  http.get({hostname: "www.broofa.com", path: "/"}, function (res) {
    test.equal(res.statusCode, 200, 'got 200');
    test.done();
  });
};

exports.test2 = function (test) {
  test.expect(1);
  http.get({hostname: "www.no-such-domain.com", path: "/"}, function (res) {
    test.equal(res.statusCode, 200, 'got 200');
    test.done();
  }).on('error', function() {
    // Comment line below out to repro the "Undone tests" error
    test.done();
  });
};

Estoy trabajando alrededor de él bifurando el servidor en su propio proceso en la configuración y luego matándolo en el desmontaje. Creo que el problema tenía que ver con el servidor que se creaba y no el cierre. Gracias @matteofigus por eso.

var cp = null; // child process
exports["tests"] = {
    "setUp": function (callback) {
        cp = fork("./lib/server.js", {"silent": true});
        callback();
    },
    "tearDown": function (callback) {
        cp.kill("SIGHUP");
        callback();
    },
    "CanIHaveSomeTeaPlease?": function (test) {
        test.expect(4);
        client.get("/tea", function (err, req, res, data) {
            test.equal(err.statusCode, 418, "Expected ImATeapot Error.");
            test.equal(err.message, "Want a biscuit?", "Expected to be asked if I want a buscuit.");
            test.equal(err.restCode, "ImATeapotError");
            test.equal(err.name, "ImATeapotError");
            test.done();
        });
    },
    "TakeThisInfo": function (test) {
        test.expect(1);
        client.put("/push", {
            "hello": "world"
        }, function (err, req, res, data) {
            test.ok(false);
            test.done();
        });
    }
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top