在 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 用户对象,因此您可以继续测试应用程序的功能。
我是 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 用户对象,因此您可以继续测试应用程序的功能。