Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 测试受保护的api调用、mocha、supertest、node js、passport_Node.js_Passport.js_Supertest - Fatal编程技术网

Node.js 测试受保护的api调用、mocha、supertest、node js、passport

Node.js 测试受保护的api调用、mocha、supertest、node js、passport,node.js,passport.js,supertest,Node.js,Passport.js,Supertest,我有一个受保护的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-

我有一个受保护的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();
  });
});
这是我对受保护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);
        })
    });
我首先发布我的登录名。然后,在登录回调中调用受保护的api调用。应该是200,但我有401。这个特性在我的客户机中工作,所以在我的测试中出了问题

我还试图在函数中删除我的postValidLoginRedentials,但没有成功


有什么想法吗?

我假设您使用的是“本地”登录策略,并使用cookie维护会话

用户登录后,您需要一种方法来识别发出认证请求的登录用户。在cookie中使用会话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的代理功能。您可以在中阅读有关它的内容(该示例正是关于cookie存储的),也可以在supertest repo中阅读大量相关内容。

您是否有机会查看我下面的建议?谢谢您的回复。在你发布之前,我找到了一个解决方案。我在登录时使用了设置cookie。然后在我的受保护路径调用中使用“get”cookie。我用较低级别的超级药剂来做这件事。所以我不确定你的解决方案是否有效。我不确定我是否理解你的评论,但你不应该自己设置cookie,因为passport会帮你做。还是你只是修改了你的测试,而我弄错了?