使用passport.js和express.js进行单元测试登录

6 javascript unit-testing node.js express passport.js

我正在尝试测试我的本地登录.我已经实现了passport.js,遵循它的指南并遵循这个MEAN骨架.

我很确定实现很好,但是测试总是出现验证错误.

如果身份验证失败,则应该重定向到"/ signin",
如果身份验证正确则应该转到"/"

但是当我测试时,身份验证总是失败.

这是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);
Run Code Online (Sandbox Code Playgroud)

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);
            });
        }
    ));
}
Run Code Online (Sandbox Code Playgroud)

并测试: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();
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

这是终端显示的内容:

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


  0 passing (24ms)
  1 failing

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

      actual expected

      /signin
Run Code Online (Sandbox Code Playgroud)

Moc*_*tfi 9

我正在尝试使用此代码并按预期工作

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

})
})
Run Code Online (Sandbox Code Playgroud)

有关更多参考,请检查此测试用户

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