unit testing用passport.js和express.jslogin

我试图testing我的本地login。 我已经用passport.js实现了,遵循它的指导并遵循这个MEAN框架。

我很确定实现是正确的,但是总是失败的testing有问题。

如果authentication失败,应该redirect到“/ signin”
如果authentication是正确的,应该去“/”

但是当我testing时,authentication总是失败。

这是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); }); } )); } 

并testing: 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 : "user@user.com", firstName: "Full Name", lastName : "Last Name", password : "pass11" }); user.save(); return done(); }); describe("Authentication", function() { return it("Local login", function(done) { return server.post("/users/session").send({ email : "user@user.com", password: "pass11" }).end(function(err, res) { res.headers.location.should.have.equal("/"); return done(); }); }); }); return after(function(done) { User.remove().exec(); return done(); }); }); }); 

这是terminal显示的内容:

 <Unit Test> API User: Authentication 1) Local login 0 passing (24ms) 1 failing 1) <Unit Test> API User: Authentication Local login: actual expected /signin 

我试图使用这个代码,并按预期工作

 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 : "user@user.com", 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', 'user@user.com') .field('password', 'pass11') .expect('Location','/') .end(done) }) after(function(done) { User.remove().exec(); return done(); }); }) }) 

为更多的参考检查这个testing用户

这里是我的截图 在这里输入图像描述