在 mocha 测试中模拟 everyauth 登录 - nodejs

Mocking everyauth login in a mocha test - nodejs

我是 mocha 的新手,正在尝试熟悉在 mocha 中编写测试。我有一个场景,我目前正在使用 everyauth 来使用 facebook 身份验证对用户进行身份验证。因此,我可能会向端点 users/profile 发出请求,如下所示:

router.route('/profile')
  .get(function(req, res) {
    if(req.session.auth) {
      res.json({
        user: req.user.toObject({getters: true})
      });
    } else {
      res.status(HttpStatus.UNAUTHORIZED);
      res.json({
        message: 'You need to be logged in to view this information'
      });
    }
  });

如果我想使用 mocha 和 superagent 测试这个端点,我该怎么做?我将如何使用 mocha 框架模拟使用 everyauth 的登录。

我目前有一个测试如下所示:

  it('should return user information on being logged in', function(done) {
    superagent.get(url + '/users/profile').end(function(err, res) {
      expect(res.status).to.equal(200);
      expect(res.body).to.eql({
          users: // some user object
      });
      done();
    });
  });

但是,除非我能够模拟登录,否则我无法测试是否通过调用端点返回了正确的数据。

当然,解决此问题的一种方法是使用 mocking/stubbing 框架(例如非常流行的 Sinon 存根)模拟身份验证模块以进行测试。 Sinon 让你 "override" 一个函数,这样就可以 return 代替那个函数 运行

在不熟悉 everyauth 的情况下,你会想要这样的东西:

sinon.stub(everyauth, "authenticateUser").yields(null, {
    user: {
        firstName: 'John',
        // etc.
    }
});

其中 everyauth 是主要对象,authenticateUser 是您想要存根的方法,并且产量应该 return 与 "authenticateUser" 通常 return 完全相同,所以这可以 return 通常 returned 的 Facebook 用户对象,因此您可以继续测试应用程序的功能。