2013-11-23 38 views
5

Sto provando a verificare il mio login locale. Ho implementato con passport.js, seguendo la sua guida e seguendo questo scheletro MEAN.Accesso test unitario con passport.js e express.js

Sono abbastanza sicuro che l'implementazione sia soddisfacente, ma c'è qualcosa di sbagliato nel test che fallisce sempre l'autenticazione.

Se l'autenticazione fallisce dovrebbe essere redirect a "/ signin"
se l'autenticazione è corretto si deve andare a "/"

Ma quando prova, l'autenticazione non riesce sempre.

Questo è routes.js:

module.exports = function(app, passport, auth) { 
    var users = require('../app/controllers/users'); 
    app.get('/signin', users.signin); 

    app.post('/users/session', passport.authenticate('local', { 
     failureRedirect: '/signin', 
     failureFlash: 'Invalid email or password.' 
    }), users.session); 

    var index = require('../app/controllers/index'); 
    app.get('/', index.render); 

passport.js:

var mongoose = require('mongoose'), 
LocalStrategy = require('passport-local').Strategy, 
User = mongoose.model('User'), 
config = require('./config'); 


module.exports = function(passport) { 
    //Serialize sessions 
    passport.serializeUser(function(user, done) { 
     done(null, user.id); 
    }); 

    passport.deserializeUser(function(id, done) { 
     User.findOne({ 
      _id: id 
     }, '-salt -hashed_password', function(err, user) { 
      done(err, user); 
     }); 
    }); 

    //Use local strategy 
    passport.use(new LocalStrategy({ 
      usernameField: 'email', 
      passwordField: 'password' 
     }, 
     function(email, password, done) { 
      User.findOne({ 
       email: email 
      }, function(err, user) { 
       if (err) { 
        return done(err); 
       } 
       if (!user) { 
        return done(null, false, { 
         message: 'Unknown user' 
        }); 
       } 
       if (!user.authenticate(password)) { 
        return done(null, false, { 
         message: 'Invalid password' 
        }); 
       } 
       return done(null, user); 
      }); 
     } 
    )); 
} 

e test: api.js:

var User, app, mongoose, request, server, should, user; 

should = require("should"); 
app  = require("../server"); 
mongoose = require("mongoose"); 
User  = mongoose.model("User"); 
request = require("supertest"); 
server = request.agent("http://localhost:3000"); 

describe("<Unit Test>", function() { 
    return describe("API User:", function() { 
    before(function(done) { 
     user = new User({ 
     email : "[email protected]", 
     firstName: "Full Name", 
     lastName : "Last Name", 
     password : "pass11" 
     }); 
     user.save(); 
     return done(); 
    }); 
    describe("Authentication", function() { 
     return it("Local login", function(done) { 
     return server.post("https://stackoverflow.com/users/session").send({ 
      email : "[email protected]", 
      password: "pass11" 
     }).end(function(err, res) { 
      res.headers.location.should.have.equal("/"); 
      return done(); 
     }); 
     }); 
    }); 
    return after(function(done) { 
     User.remove().exec(); 
     return done(); 
    }); 
    }); 
}); 

Thi s è ciò che il terminale visualizza:

<Unit Test> 
    API User: 
     Authentication 
     1) Local login 


    0 passing (24ms) 
    1 failing 

    1) <Unit Test> API User: Authentication Local login: 

     actual expected 

     /signin 

risposta

8

sto cercando di utilizzare questo codice e il lavoro come previsto

var User, app, mongoose, request, server, should, user, agent; 

should = require("should"); 
app  = require("../server"); 
mongoose = require("mongoose"); 
User  = mongoose.model("User"); 
request = require("supertest"); 
agent = request.agent(app) 

describe('User', function() { 
    before(function(done) { 
     user = new User({ 
     email : "[email protected]", 
     firstName: "Full Name", 
     lastName : "Last Name", 
     password : "pass11" 
     }); 
     user.save(done) 
    }); 
    describe('Login test', function() { 
     it('should redirect to /', function (done) { 
     agent 
     .post('/users/session') 
     .field('email', '[email protected]') 
     .field('password', 'pass11') 
     .expect('Location','/') 
     .end(done) 
     }) 

    after(function(done) { 
     User.remove().exec(); 
     return done(); 
    }); 

}) 
}) 

per più controllo di riferimento questo test-user

qui il mio screenshot enter image description here

+0

Si! Molte grazie! Il mio problema era nel 'server = request.agent (" http: // localhost: 3000 ");'. Ho messo 'server = request.agent (app);' e questo è tutto! ;) –

+0

Ho un login e un'autenticazione molto simile. Sto cercando di adattare questo codice per i miei bisogni. Per qualche motivo l'utente del test non è stato creato nel mio DB. Quale potrebbe essere la causa di questo? – MadPhysicist

+0

L'unità prova sopra solo per il test. Il processo è inserire un nuovo utente, controllare il test di accesso, quindi eliminare l'utente dopo il test. quindi dopo il test completo l'utente dovrebbe essere cancellato. –