[英]Asynchronous test with Mocha and Chai GET doesn't work for Node.js Rest API
[英]How to test RESTful CRUD api with Mocha Chai on Node.js server side if login needed?
我想测试一个Web应用服务器端CRUD逻辑。 但只有登录用户才能访问该网络应用。
if (res.locals.user){
//CRUD functions here
}
我知道如何在没有登录检查的情况下使用Mocha和Chai来测试这些CRUD函数,但是如何模拟登录用户来测试它们呢? 用饼干?
我通常会做一些事情:
var request = require('supertest');
describe('My tests', function(){
var agent = request.agent(app);
//before all the tests run, log in
before(function(done){
request(app)
.post('/login')
.send({
username: 'a@b.com',
password: 'password123'
})
.end(function (err, res) {
if (err) { return done(err); }
agent.saveCookies(res);
done();
});
});
it('Does something when logged in', function (done){
var req = request(app).get('/account/something')
.expect(200);
//attach the logged in cookies to the agent
agent.attachCookies(req);
req.end(done);
//assertions here
});
})
首先触发登录请求,将cookie保存到代理
然后,在请求中,我想使用经过身份验证的请求。 将cookie附加到它。
app
是Express应用程序的实例
@Russj,假设:
passport-local
passport
作为passport
认证策略 supertest
来模拟你的api通话 那么我就是如何测试经过身份验证的端点:
var request = require('supertest'),
agent = request.agent();
mongoose = require('mongoose'),
// this examples assumes /path/to/your/app exports your Express app
app = require('/path/to/your/app'),
// replace this with the model you use for authentication
UserModel = mongoose.model('UserModel');
// this example assumes your user model looks something like the following:
//
// UserModel = new mongoose.Schema({
// username: String,
// password: String
// });
describe('testing authenticated end-point', function () {
var UserModel, testuser;
before(function (done) {
// this is just to ensure we have a user to log in for your tests
UserModel.findOneAndUpdate({
{ username: 'testuser' },
{ username: 'testuser', password: 'testpassword' },
{ upsert: true }, // this will create the user if it doesn't already exist
function(err, doc) {
testuser = doc
}
});
// I assume /simulate-login is not an existing route in your app
app.get('/simulate-login', function(req, res) {
req.login(testuser); // .login is exposed in req by passport
});
// now we simulate login of our testuser and save the cookies
request(app)
.get('/simulate-login')
.end(function (err, res) {
if (err) { return done(err); }
// save cookies
agent.saveCookies(res);
done();
});
});
// clean up after ourselves
after(function () {
UserModel.remove({ username: 'testuser' }).exec();
});
// now we can test an authenticated end-point as long as we attach the saved cookies
it('should do whatever...', function (done) {
var req;
req = request(app)
.get('/path/to/route/to/test')
.expect(200);
// attach cookies
agent.attachCookies(req);
// do your reqeust
req.end(done);
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.