Поддержание сеанса во время тестирования с использованием SuperTest

#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 — как показано здесь.

Надеюсь, это сэкономит кому-то время, которое я потратил!