无法使用Mocha和Supertest进行身份验证请求

时间:2015-12-14 15:55:30

标签: node.js mocha supertest

我试图用Mocha和Supertest测试一个API而没有幸运能让它发挥作用。 我有以下代码:

var supertest = require('supertest');  
describe('Routing', function() {
    var url = 'http://example.com';
    var server = supertest.agent(url);

    var credentials = {
        user: 'username',
        pass: 'password'
    };


    describe('Login', function() {

        it('should login ok given valid credentials', function(done) {
            server
                .post('/login.php')
                .send(credentials)
                .end(function(err, res) {
                    if (err) {
                        throw err;
                    }                   
                    server.saveCookies(res);
                    done();
                });
        });


        it('should correctly make an authenticated request', function(done){
            server
                .get('/api/me/accounts?_=1449865354112')
                .end(function(err,res) {
                    if (err) {
                        throw err;
                    }
                    res.status.should.be.equal(200);
                    done();
                });
        }); 
    });
});

登录请求正常,我通过身份验证。第二个电话会抛出401状态。 我阅读了文档,但我无法使用。

有什么问题? 谢谢!

更新 我最后通过使用.field('user', 'myUsername').field('pass', 'myPassword')发送参数进行身份验证。

此外,我必须在呼叫之间保持cookie: 我通过身份验证时cookie = res.headers['set-cookie'];,并在下次请求时.set('cookie', cookie)

2 个答案:

答案 0 :(得分:0)

这是因为你的两个测试之间没有持久化会话(cookie)。

  • 首先,你应该在同一个测试中进行两次调用。
  • 其次我记得我曾经使用superagent在同一服务器的两次调用之间保持会话。但似乎supertest现在暴露代理人来坚持会议。

    var supertest = require('supertest');
    var app = express();
    var agent = supertest.agent(app);
    // then you can persist cookie
    agent
      .post('/login.php')
      .auth(credentials)
      ...
    

编辑: 这是我如何使用superagent进行测试的一个例子:

    var request = require('superagent');
    var postData= {
      email: 'john@test.com',
      password: 'test'
    };

    var user1 = request.agent();
      user1.post('http://localhost:3000/user/login')
        .send(postData)
        .end(function (err, res) {
          expect(err).to.not.exist;
          expect(res.status).to.equal(200);
          var result = res.body;
          expect(result.data.message).to.equal('Login successful');

          user1.get('http://localhost:3000/user')
            .end(function (err, res) {
              expect(err).to.not.exist;
              expect(res.status).to.equal(200);
              var result = res.body;
              expect(result.data.email).to.equal('john@test.com');
              done();
            });
        });

答案 1 :(得分:0)

.send()适用于您的数据。 .auth()代表您的凭据。尝试:

it('should login ok given valid credentials', function(done) {
    server
        .post('/login.php')
        .auth(credentials)
        .send({"some": "value"})
        .expect(200)
        .end(function(err, res) {
            if (err) {
                done(error);
            }                   
            server.saveCookies(res);
            done();
        });
});

有关supertest的更多信息,请参阅http://visionmedia.github.io/superagent/docs/test.html