#node.js #mocha.js #passport.js #supertest
#node.js #mocha.js #passport.js #супертест
Вопрос:
Я хочу использовать supertest для тестирования запросов и ответов API. Ниже приведено то, что я пробовал до сих пор.
route.test.js
const testUtils = require('./setupTestUtils');
let authenticateUser = request.agent(app);
before(function(done){
testUtils.login(authenticateUser, userCredentials).then((res) => {
expect(res.statusCode).to.equal(200);
done();
}, (err) => {
console.log(err);
done(err);
});
});
setupTestUtils.js
function login (rest, testUserLogin) {
let defer = Q.defer();
rest.post('/login')
.send(testUserLogin)
.expect(200)
.end(function () {
rest.get('/loggedin')
.expect((res) => {
if (err) {
console.log('ERROR: ' JSON.stringify(err));
defer.reject(err);
} else {
defer.resolve(res);
}
})
.end();
});
return defer.promise;
}
В моем app.js , Я использую паспорт для аутентификации. После аутентификации я использую функцию session.regenerate для восстановления идентификатора сеанса, чтобы избежать фиксации сеанса.
Первоначальный запрос post для входа в систему проходит без каких-либо сбоев. Однако последующий запрос GET ‘LoggedIn’ завершается с ошибкой. Эта функция внутренне использует функцию req.IsAuthenticated() из passport. Это всегда возвращает false.
При исследовании я обнаружил, что идентификатор сеанса между восстановленным сеансом и объектом запроса (для req.IsAuthenticated()) отличается.
Из моего поиска я понимаю, что файлы cookie должны поддерживаться автоматически с помощью «агента» из supertest. Однако, похоже, это не так для меня. Я также попытался сохранить файлы cookie из первоначального ответа. Похоже, это тоже не работает для меня. » res.headers [‘set-cookie’] » отображается как неопределенный (не уверен, почему это происходит).
Может кто-нибудь, пожалуйста, помочь мне понять, чего мне здесь не хватает.?
Я использую версии — Supertest @ v6.0.1 и passport @ v0.4.1
Ответ №1:
Я нашел решение своей проблемы в старой проблеме github, поднятой на странице supertest. Ссылка на него здесь для справки.
По сути, супертест запускается express на небезопасном порту, и я настроил свой сеанс иначе. В идеале нам нужно было бы проверить среду, прежде чем устанавливать для этой переменной значение false — как показано здесь.
Надеюсь, это сэкономит кому-то время, которое я потратил!