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

8
我正在尝试测试本地登录。我已经使用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);

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

测试内容: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();
    });
  });
});

这是终端显示的内容:
<Unit Test>
    API User:
      Authentication
        1) Local login


  0 passing (24ms)
  1 failing

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

      actual expected

      /signin
1个回答

12

我尝试使用这段代码,它按预期工作了。

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

})
})

欲了解更多信息,请查看此测试用户

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


耶!非常感谢!我的问题在于 server= request.agent("http://localhost:3000");。我已经改成了 server = request.agent(app); 就解决了!;) - user2359967
我有一个非常类似的登录和认证。我正在尝试根据我的需求调整这段代码。由于某种原因,测试用户没有在我的数据库中创建。可能是什么原因导致了这个问题? - MadPhysicist
以上的单元测试仅用于测试。流程是插入新用户,检查登录测试,然后在测试后删除用户。因此,在测试完成后,应该删除用户。 - Moch Lutfi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接