node.js - 测试 protected api 调用、mocha、supertest、node js、passport

标签 node.js passport.js supertest

我有一个 protected API 调用,其中 Passport 作为中间件:

  server.get('/api/pipes', auth, api.pipes);

如果用户未获得授权,auth 方法将返回 401。

我有这个测试来查看用户是否已登录:

  var postValidLoginCredentials = function(){
    return request(url).post('/api/login')
      .set('Content-Type', 'multipart/form-data')
      .field('email', 'john.smith@example.com')
      .field('password', 'example')
  };

//This pass passes
it('should return 200 OK when a user enters a valid user and pass', function(done){
  postValidLoginCredentials()
  .end(function(err, res){
    res.should.have.status('200');
    done();
  });
});

这是我对 protected api 调用的测试:

it('should return 200 OK on GET /api/pipes when user is loggedin', function (done) {
      postValidLoginCredentials()
        .end(function(err, res){
          request(url)
            .get('/api/pipes')
            .set('Accept', 'application/json')
            .expect(200, done);
        })
    });

我首先发布我的登录信息。然后,在登录回调中,我调用 protected api 调用。应该是 200,但我得到了 401。该功能在我的客户端中有效,因此在我的测试中出现了问题。

我也尝试过在函数中添加 postValidLoginCredentials,但没有成功。

有什么想法吗?

最佳答案

我假设您使用“本地”登录策略,并使用 cookie 维持 session 。

用户登录后,您需要一种方法来识别发出经过身份验证的请求的登录用户。当在 cookie 中使用 session ID 时,您可以这样做:

it('should return 200 OK on GET /api/pipes when user is loggedin', function (done) {
      postValidLoginCredentials()
        .end(function(err, res){
          request(url)
            .get('/api/pipes')
            .set('Accept', 'application/json')
            .set('Cookie', res.headers['set-cookie'])
            .expect(200, done);
        })
    }); 

但是,这只是一种解决方法,您应该使用 supertest 的代理功能。您可以在README中阅读相关内容。 (这个例子正是关于cookie存储的),或者读一堆tests using it在 super 测试仓库中。

关于node.js - 测试 protected api 调用、mocha、supertest、node js、passport,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23406934/

相关文章:

node.js - 使用 supertest 测试时 Koa 应用程序挂起

javascript - 从 Node NPM 应用程序公开模块

node.js - 在 Express 中访问原始 POST 数据

node.js - 测试express API需要本地服务器

javascript - 使用额外的括号调用对象方法

angularjs - Passport 和 Angular 之间的中间件

asynchronous - 测试 Mocha/supertest/expect MEAN-stack HTTP 请求延迟 4 秒完成

javascript - ipcMain 事件处理程序中的 Electron TypeError

javascript - Express.Static 不适用于子目录

database - passportjs 和 passportlocal 添加用户 "Error: failed to serialize user into session"