我有一台Express服务器,我使用本地护照进行身份验证。我有以下受保护路线:
app.post("/api/test", connect.ensureLoggedIn("/"), (req, res) => {
let test = new Test(req.body);
test
.save()
.then(data => {
return res.json(data);
})
.catch(e => {
return res.status(HTTP_RESPONDE_BAD_REQUEST).send(e);
});
});
我想知道如何测试上述路线以确保用户登录。
这是我目前的测试(它没有通过,因为我无法发送身份验证:
it("Testing protected route", done => {
chai
.request(server)
.post("/api/test")
.send(test)
.end((err, res) => {
expect(res.status).to.equal(200);
done();
});
});
我尝试了以下操作,但是当我运行测试时,他们会将我重定向到登录页面。
it("Testing protected route", done => {
chai
.request(server)
.post("/api/test")
.set('Authorization', 'Bearer ' + token) // user token id
.send(test)
.end((err, res) => {
expect(res.status).to.equal(200);
done();
});
});
it("Testing protected route", done => {
chai
.request(server)
.post("/api/test")
.set('token', token) // user token id
.send(test)
.end((err, res) => {
expect(res.status).to.equal(200);
done();
});
});
有更简单的方法来测试吗?
答案 0 :(得分:0)
我正在使用supertest
和mocha
进行单元测试以及令牌的自定义标头,但我的测试使用了类似的模式。在运行任何测试之前,数据将加载到数据库中并且用户已登录,然后该令牌将用于需要身份验证的每个测试。
TestUtils类
this.authenticateUser = (user, app) =>
new Promise((resolve, reject) => {
request(app)
.post('/authenticate')
.send({
email: user.email,
password: user.test_password,
})
.end((err, res) => {
if (err) {
return reject(err);
}
return resolve(res.body.token);
});
});
测试类
describe('Authed Routes', () => {
let app = null;
let authUser = null;
before((done) => {
// mocking should happen before the app is created.
app = require('../server');
// Populate redis data
TestUtils.populateRedis(() => {
// Populate db data
TestUtils.syncAndPopulateDatabase('public-tests', () => {
// Get the test user
authUser = TestUtils.getUser();
// Authenticate the user to get a token
TestUtils.authenticateUser(authUser, app)
.then((accessToken) => {
// Keep the token on the user so we can use it in the tests
authUser.access_token = accessToken;
return done();
})
.catch((err) => done(err));
});
});
});
describe('/secure/route', () => {
it('should allow /secure/route with correct token provided', (done) => {
request(app)
.get('/secure/route')
// add the access token from the user as a header value
.set('x-access-token', authUser.access_token)
.expect(200)
.end((err, res) => {
done();
});
});
});
});