Как аутентифицировать запросы Supertest с помощью стратегии Passport /Facebook/?

Я использую Passport.js для аутентификации (стратегия Facebook) и тестирования с помощью Mocha и Supertest. Как я могу создать сеанс и выполнять аутентифицированные запросы со стратегией Supertest для Facebook?

Вот пример теста, когда пользователь не вошел в систему:

  describe 'when user not logged in', ->

    describe 'POST /api/posts', ->
      it 'respond with 401', (done)->
        request(app).
          post(API.url('posts')).
          set('Accept', 'application/json').
          send(post: data).
          expect('Content-Type', /json/).
          expect(401, done)

Спасибо за совет :D


person Zeck    schedule 17.12.2013    source источник


Ответы (3)


Похоже, здесь есть несколько разных вещей, поэтому я разделил свой ответ на две части.

1) Сначала необходимо создать тестовых пользователей через Facebook. Вы можете сделать это одним из двух способов: 1) через Facebook Graph API или 2) через страницу ролей вашего приложения.

2) Рекомендуемый метод для сохранения сеансов с SuperTest — использовать метод SuperAgent с именем .agent() для сохранения сеансов. Все, что можно сделать с SuperAgent, можно сделать и с SuperTest. Дополнительную информацию см. в этом сообщении на Github.

var supertest = require('supertest');
var app = require('../lib/your_app_location');

describe('when user not logged in', function() {
    describe('POST /api/posts', function() {
        var agent1 = supertest.agent(app);

        agent1
            .post(API.url('posts'))
            .set('Accept', 'application/json')
            .send(post: data)
            .(end(function(err, res) {
                should.not.exist(err);
                res.should.have.status(401);
                should.exist(res.headers['set-cookie']);
                done();
            }));
    });
});

На VisionMedia Github есть еще несколько хороших фрагментов кода. Найдите их здесь.

person erichrusch    schedule 22.12.2013
comment
Спасибо. Ваш ответ мне очень помог :D - person Zeck; 23.12.2013
comment
Можете ли вы показать пример того, как вы аутентифицируетесь в Facebook? т.е. как вы осуществляете вход в систему? Я чувствую, что, возможно, я что-то упускаю. - person Kilizo; 09.11.2016

Общее решение состоит в том, чтобы создать банку cookie, которая будет повторно использоваться между запросами.

Следующий пример не относится к конкретному паспорту, но должен работать:

var request = require('request');

describe('POST /api/posts', function () {
    // Create a new cookie jar
    var j = request.jar();
    var requestWithCookie = request.defaults({jar: j}),

    // Authenticate, thus setting the cookie in the cookie jar
    before(function(done) {
        requestWithCookie.post('http://localhost/user', {user: 'foo', password: 'bar'}, done);
    });

    it('should get the user profile', function (done) {
        requestWithCookie.get('http://localhost/user', function (err, res, user) {
            assert.equal(user.login, 'foo');
            done();
        });
    });
});
person Paul Mougel    schedule 20.12.2013
comment
Является ли это решением для локальной стратегии? или базовая аутентификация? - person Ellery Familia; 04.08.2014

В этом примере показано, как выполнить часть супертеста тестирование:

describe('request', function() {
  describe('persistent agent', function() {
    var agent1 = request.agent();
    var agent2 = request.agent();
    var agent3 = request.agent();
    var agent4 = request.agent();

    it('should gain a session on POST', function(done) {
      agent3
        .post('http://localhost:4000/signin')
        .end(function(err, res) {
          should.not.exist(err);
          res.should.have.status(200);
          should.not.exist(res.headers['set-cookie']);
          res.text.should.include('dashboard');
          done();
        });
    });

Вот сообщение в блоге об этом.

person Michael Cole    schedule 19.04.2015