Estoy ocupado construyendo pruebas funcionales para una API de nodejs existente que escribí. Estoy usando mocha y wait.js.

Una prueba que falla es cuando quiero hacer una prueba negativa para la existencia de un parámetro de URL. Lo que quiero es enviar un mensaje al consumidor del servicio si falta el parámetro.

Actualmente la prueba positiva que tengo funciona:

var request = require('request');

it('get a specific user from the api', function (done) {
    request.get('http://localhost:8080/api/v1/user/123', function (error, response, body) { ... });
});

Sin embargo, lo siguiente no funciona y todo lo que obtengo es un tiempo de espera:

it('should return a 400 message if UserId is not supplied stating that "UserId expected"', function(done) {
    request.get('http://localhost:8080/api/v1/user/', function (error, response, body) { 
        if (!error && response.statusCode == 400) {
            expect(body).to.be.equal('UserId expected');
            done();
        }
    });
});

Ambas pruebas anteriores están probando este punto final:

app.get('/api/v1/user/:userid', function (req, res) {
    if(!req.params.userid) {
        return res.status(400).json('UserId expected');
    }

    ... get the user and return it with status 200 ...
});

Sin embargo, como se indicó anteriormente, la primera prueba es exitosa mientras que la segunda prueba se agota.

Actualización 1: además, obtengo el siguiente resultado:

GET /api/v1/user/123 200 2.905 ms - 274
GET /api/v1/user/ - - ms - -

Actualización 2: agregar el siguiente código resuelve el problema, pero en realidad no resuelve el problema:

app.get('/api/v1/user', function (req, res) {
    return res.status(400).json('UserId expected');
});

Obviamente, no quiero un fragmento de código bastante redundante por ahí. Estoy desconcertado de por qué no puedo ingresar el punto final 'api / v1 / user /: userid' y simplemente probar la existencia de :userid allí. Es como si nodejs requiriera la existencia de :userid, de lo contrario, el punto final no existe. ¿Es esto correcto?

¿Qué me estoy perdiendo?

0
Ebbs 28 ene. 2016 a las 00:09

2 respuestas

La mejor respuesta

Así que investigué un poco más e hice otra pregunta con respecto a este problema aquí.

Al final, el problema fue que no entendí completamente el marco expreso. Básicamente, a lo que aludí en la Actualización 2 de mi pregunta es la ruta que tendré que seguir y especificar una ruta donde no se espera ningún parámetro, pero devuelva el mensaje de error que estoy esperando en ese caso.

El problema que tengo con este enfoque es que, en algunos casos, es posible que desee utilizar más de un parámetro en ur. Sin embargo, esto significará que las permutaciones para adaptarse a cada escenario donde un parámetro no está definido se vuelven un poco desalentadoras. (2 parámetros significarán 4 combinaciones, 3 significarán 9, etc.) ¡Esto será una pesadilla de mantenimiento!

Mi enfoque a partir de ahora será seguir un enfoque en el que cualquier información que quiera pasar al servidor se enviará a través de JSON en el cuerpo de cada solicitud. Esto me permitirá mantenerme en una sola ruta.

0
Community 23 may. 2017 a las 11:44

De acuerdo con la documentación de mocha, la devolución de llamada realizada siempre debe llamarse, también en caso de errores. De hecho acepta un error. Entonces creo que debes reescribir tu código con:

it('should return a 400 message if UserId is not supplied stating that "UserId expected"', function(done) {
    request.get('http://localhost:8080/api/v1/user/', function (error, response, body) {
        if (error) return done(error);
        if (response.statusCode != 400) return done(new Error("Not 400"));

        expect(body).to.be.equal('UserId expected');
        done();
    });
});
0
Davide Icardi 27 ene. 2016 a las 21:29