6

我正在使用 Passport.js 进行身份验证(Facebook 策略)并使用 Mocha 和 Supertest 进行测试。如何使用 Supertest for 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

4

3 回答 3

12

这里看起来几乎没有什么不同,所以我将我的答案分为两部分。

1)您首先必须通过 Facebook 创建测试用户。您可以通过以下两种方法之一执行此操作:1) Facebook 的 Graph API,或 2) 通过应用程序的角色页面。

2) 使用 SuperTest 保持会话的推荐方法是使用名为 .agent() 的 SuperAgent 方法来保持会话。您可以使用 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 上还有其他一些不错的代码片段。请在这里找到它们。

于 2013-12-22T17:39:31.547 回答
2

一般的解决方案是创建一个 cookie jar 将在请求之间重复使用。

以下示例不是特定于护照的,但应该可以工作:

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();
        });
    });
});
于 2013-12-20T14:07:45.057 回答
0

这个例子展示了如何进行测试的 SuperTest 部分:

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();
        });
    });

这是一篇关于它的博客文章

于 2015-04-19T04:28:35.670 回答