2014-05-01 66 views
2

我有护照受保护的API调用中间件:测试受保护的API调用,摩卡,supertest,节点JS,护照

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

如果用户没有授权的身份验证方法返回一个401。

我要看看这个测试,如果用户的loggedIn:

var postValidLoginCredentials = function(){ 
    return request(url).post('/api/login') 
     .set('Content-Type', 'multipart/form-data') 
     .field('email', '[email protected]') 
     .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.该功能在我的客户端运行,所以在我的测试中出现问题。

我也试过但我的postValidLoginCredentials在一个函数中,但它没有工作。

有什么想法?

+0

您有没有机会查看我的建议? – Esteban

+0

Thx为您的answear。在发布之前,我找到了解决方案。我在登录中使用了设置的cookie。然后我在受保护的路径调用中使用“获取”cookie。我使用较低级别的superagent来做到这一点。所以我不确定你的解决方案是否有效。 – Per

+0

我不确定我是否理解你的评论,但你不应该自己设置cookie,因为护照会为你做。或者你是否只修改了你的测试,并且我弄错了? – Esteban

回答

1

我假设您使用的是“本地”登录策略,并使用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的代理功能来代替。你可以在README(这个例子恰恰是关于cookie存储)中读到它,或者阅读超级回购中的一堆tests using it