tutorial test nodejs node headers examples before node.js express mocha supertest

node.js - nodejs - supertest set headers



Pruebas de solicitudes que redireccionan con mocha/supertest en el nodo (4)

Hay una afirmación incorporada para esto en supertest :

should = require(''should'') request = require(''supertest'') app = require(''../../app'') describe ''authentication'', -> describe ''POST /sessions'', -> describe ''success'', -> it ''redirects to the right path'', (done) -> request(app) .post(''/sessions'') .send(user: ''username'', password: ''password'') .expect(302) .expect(''Location'', ''/home'') .end(done)

Parece que no puedo obtener la siguiente prueba de integración para pasar en un proyecto expreso utilizando mocha , supertest y should (y coffeescript).

La prueba

should = require(''should'') request = require(''supertest'') app = require(''../../app'') describe ''authentication'', -> describe ''POST /sessions'', -> describe ''success'', (done) -> it ''displays a flash'', (done) -> request(app) .post(''/sessions'') .type(''form'') .field(''user'', ''username'') .field(''password'', ''password'') .end (err, res) -> res.text.should.include(''logged in'') done()

Código de aplicación relevante

app.post ''/sessions'', (req, res) -> req.flash ''info'', "You are now logged in as #{req.body.user}" res.redirect ''/login''

Fracaso

1) authentication POST /sessions success displays a flash: AssertionError: expected ''Moved Temporarily. Redirecting to //127.0.0.1:3456/login'' to include ''logged in''

Obviamente, el código de la aplicación no hace nada útil. Solo intento que la prueba pase.

Poner la expectativa ( res.text.should.include(''logged in'') ) fuera de la función final y dentro de la función expect produce los mismos resultados. También probé una variación de las llamadas a función, por ejemplo, quitando la llamada .send(user: ''username'', password: ''password'') .type(''form'') y usando .send(user: ''username'', password: ''password'') lugar de los dos .field() llamadas.

Si esto significa algo, al enviar una solicitud de POST de curl a la aplicación cuando se está ejecutando localmente se obtiene el mismo resultado ( Moved Temporarily. Redirecting to //127.0.0.1:3456/login )

Tengo la sensación de que este es un error trivial. Posiblemente algo que estoy olvidando en el código de la aplicación o el código de prueba.

¿Alguna sugerencia?

EDIT 1: También vale la pena señalar que al hacer clic en el botón de enviar en el navegador obtengo los resultados esperados (un mensaje flash).

EDIT 2: La investigación adicional muestra el resultado de cualquier redirección en el Moved Temporarily. Redirecting to ... Moved Temporarily. Redirecting to ... cuerpo de respuesta. Esto me hace preguntarme si hay un problema en la forma en que estoy exportando la aplicación en app.js.

var express = require(''express'') var app = express(); module.exports = app;


Intenté escribir algunas pruebas de integración para solicitudes que también se redireccionaron, y encontré aquí un buen ejemplo del autor del módulo.

En el ejemplo de TJ, usa el encadenamiento, así que también usé algo así.

Considere un escenario en el que un usuario conectado se redirige a la página de inicio cuando él o ella cierra sesión.

it(''should log the user out'', function (done) { request(app) .get(''/logout'') .end(function (err, res) { if (err) return done(err); // Logging out should have redirected you... request(app) .get(''/'') .end(function (err, res) { if (err) return done(err); res.text.should.not.include(''Testing Tester''); res.text.should.include(''login''); done(); }); }); });

Dependiendo de la cantidad de redireccionamientos que tenga, es posible que tenga que anotar algunas devoluciones de llamada, pero el ejemplo de TJ debería ser suficiente.


Para cualquiera que se encuentre con esta página, la respuesta a esta pregunta es bastante simple. El Moved Temporarily. cuerpo de respuesta es lo que se devuelve de supertest. Vea el problema para más detalles.

Para resumir, terminé haciendo algo como esto.

should = require(''should'') request = require(''supertest'') app = require(''../../app'') describe ''authentication'', -> describe ''POST /sessions'', -> describe ''success'', -> it ''redirects to the right path'', (done) -> request(app) .post(''/sessions'') .send(user: ''username'', password: ''password'') .end (err, res) -> res.header[''location''].should.include(''/home'') done()

Simplemente verifique que la location encabezado de respuesta sea la que espera que sea. Las pruebas de mensajes flash y ver pruebas de integración específicas se deben hacer usando otro método.


describe ''authentication'', -> describe ''POST /sessions'', -> describe ''success'', (done) -> it ''displays a flash'', (done) -> request(app) .post(''/sessions'') .type(''form'') .field(''user'', ''username'') .field(''password'', ''password'') .redirects(1) .end (err, res) -> res.text.should.include(''logged in'') done()

Los redirects() seguirán el redireccionamiento para que pueda hacer las pruebas de vista habituales.