2

我有一个以护照作为中间件的受保护的 api 调用:

  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。该功能在我的客户端中有效,因此在我的测试中出现了问题。

我也尝试将我的 postValidLoginCredentials 放在一个函数中,但它没有用。

任何想法?

4

1 回答 1

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 存储的),或者在 supertest repo 中阅读一堆使用它的测试。

于 2014-05-02T13:29:55.433 回答