2012-09-04 12 views
28

Parece que no puedo obtener la siguiente prueba de integración para pasar en un proyecto express usando mocha, supertest y should (y coffeescript).Pruebas de solicitudes que redireccionan con mocha/supertest en el nodo


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 la aplicación pertinente

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

La falta

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 intenté una variación de las llamadas a funciones, por ejemplo, eliminando la llamada .type('form') y usando .send(user: 'username', password: 'password') en lugar de las dos llamadas .field().

Si sirve de algo, el envío de una solicitud POST rizo a la de la aplicación cuando se está ejecutando localmente produce la misma salida (Moved Temporarily. Redirecting to //127.0.0.1:3456/login)

Tengo la sensación de que esto 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?

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

EDIT 2: investigación más a fondo muestra la salida del cualquier redirigir resultados en el cuerpo Moved Temporarily. Redirecting to ... 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; 
+0

Por favor, eche un vistazo: http://stackoverflow.com/questions/14001183/how-to-authenticate-supertest-requests-with-passport/37609721#37609721 –

Respuesta

22

Para cualquier persona que encuentre esta página, la respuesta a esta pregunta es bastante simple. El cuerpo de respuesta Moved Temporarily. es lo que se devuelve de supertest. Vea the issue para más detalles.

En resumen, 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() 

sólo comprueba que la cabecera de respuesta location es lo que usted espera que sea. Las pruebas de mensajes flash y ver pruebas de integración específicas se deben hacer usando otro método.

+8

... ¿qué otro método? – Alex

+3

Estoy aquí específicamente porque estaba tratando de hacer "Las pruebas de mensajes flash y ver pruebas de integración específicas deben hacerse usando otro método". –

+0

Además de verificar la ubicación en el encabezado, debe verificar que res.statusCode sea 302 (redirigir). – thefinnomenon

2

Estaba tratando de escribir algunas pruebas de integración para las solicitudes que también se redireccionaron, y encontré un buen ejemplo del propio autor del módulo here.

En el ejemplo de TJ, él está utilizando el encadenamiento, así que también usé algo así.

Considere un escenario en el que un usuario que ha iniciado sesión es redirigido a la página de inicio cuando cierra la 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 del número de redirecciones que tenga, puede que tenga que anidan unas pocas devoluciones de llamada, pero el ejemplo de TJ debería ser suficiente.

18

No está incorporado en la afirmación de 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) 
1
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() 

El redirects() seguirá la redirección para que pueda hacer sus pruebas de visión habituales.

+0

Esta puede ser una publicación anterior, pero .redirects (1) funcionó muy bien para mí para resolver un error de redirección durante la prueba. Gracias – SteveB

Cuestiones relacionadas