2012-09-04 10 views
28

io non riesco a ottenere il seguente test di integrazione di passare in un progetto espresso usando mocha, supertest, e should (e CoffeeScript).richieste di test che reindirizzano con la moka/Supertest nel nodo


Il test

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

codice applicativo Rilevante

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

La mancata

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

Ovviamente, il codice di applicazione non fa nulla di utile. Sto solo cercando di far passare il test.

Mettere l'attesa (res.text.should.include('logged in')) al di fuori della funzione di fine e all'interno della funzione expect produce gli stessi risultati. Ho anche provato una variazione delle chiamate di funzione, ad esempio rimuovendo la chiamata .type('form') e utilizzando .send(user: 'username', password: 'password') anziché le due chiamate .field().

Se significa qualcosa, l'invio di una richiesta POST curl per la l'applicazione quando è in esecuzione in locale produce la stessa uscita (Moved Temporarily. Redirecting to //127.0.0.1:3456/login)

Ho la sensazione che questo è un errore banale. Forse qualcosa che sto dimenticando nel codice dell'applicazione o nel codice di test.

Qualche suggerimento?

EDIT 1: E 'anche interessante notare che quando si fa clic sul pulsante di invio nel browser ottengo i risultati attesi (un messaggio flash).

EDIT 2: Ulteriori analisi mostra l'uscita di qualsiasi reindirizzamento risultati nel corpo Moved Temporarily. Redirecting to ... risposta. Questo mi fa chiedere se c'è un problema nel modo in cui esporto l'app in app.js.

var express = require('express') 
var app = express(); 

module.exports = app; 
+0

Si prega di dare un'occhiata: http://stackoverflow.com/questions/14001183/how-to-authenticate-supertest-requests-with-passport/37609721#37609721 –

risposta

22

Per chi si imbatte in questa pagina, la risposta a questa domanda è abbastanza semplice. Il corpo di risposta Moved Temporarily. è ciò che viene restituito da supertest. Vedi the issue per maggiori dettagli.

Per riassumere, ho finito per fare qualcosa di simile.

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

Basta verificare che l'intestazione della risposta location è ciò che ci si aspetta che sia. Il test per i messaggi flash e la visualizzazione di test di integrazione specifici devono essere eseguiti utilizzando un altro metodo.

+8

... quale altro metodo? – Alex

+3

Sono qui specificamente perché stavo cercando di fare "Test per i messaggi flash e visualizzare i test di integrazione specifici dovrebbe essere fatto utilizzando un altro metodo." –

+0

Oltre a controllare la posizione nell'intestazione, è necessario verificare che res.statusCode sia 302 (reindirizzamento). – thefinnomenon

2

Stavo cercando di scrivere alcuni test di integrazione per le richieste reindirizzate, e ho trovato un buon esempio dall'autore del modulo stesso here.

Nell'esempio di TJ, sta usando il concatenamento, quindi ho usato anche qualcosa del genere.

Considerare uno scenario in cui un utente connesso è reindirizzato alla pagina iniziale quando si disconnette.

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

A seconda di quanti reindirizza avete, potrebbe essere necessario qualche nido callback, ma l'esempio di TJ dovrebbe essere sufficiente.

18

C'è built-in di asserzioni per questo in 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() 

Il redirects() seguirà il reindirizzamento in modo da poter fare i soliti test vista.

+0

Questo potrebbe essere un vecchio post ma i .redirects (1) hanno funzionato perfettamente per me per risolvere un errore di reindirizzamento durante il test. Grazie – SteveB

Problemi correlati