摩卡测试,链接超级请求

时间:2016-01-04 10:25:11

标签: node.js mocha supertest

因此我尝试在我的快递应用中测试一条路线,为了做到这一点,我需要在拨打电话前登录user。我在user函数中创建并保存beforeEach。这是我写的测试:

it('should update username', function(done){
    var _this = this;
     req.post('/login')
      .send(_this.data)
      .then(function(res){
        req.put('/users/' + res.body.user._id)
          .send({ username: 'robert'})
          .expect(200)
          .end(function(err, res){
            if(err) return done(err);
            console.log(res.body);
            res.body.success.should.equal(true);
            res.body.user.username.should.match(/robert/);
            done();
        });
    });
 });

这是我运行测试时得到的输出:

  Users
    Routes
      Authenticated
POST /login 200 195.059 ms - 142
PUT /users/568a432e1daa24083fa6778a 401 2.785 ms - 21
        1) should update username
    Unauthenticated
GET /users 401 1.502 ms - 21
      ✓ should return 401


  1 passing (516ms)
  1 failing

  1) Users Routes Authenticated should update username:
     Error: expected 200 "OK", got 401 "Unauthorized"
      at Test._assertStatus (node_modules/supertest/lib/test.js:232:12)
      at Test._assertFunction (node_modules/supertest/lib/test.js:247:11)
      at Test.assert (node_modules/supertest/lib/test.js:148:18)
      at Server.assert (node_modules/supertest/lib/test.js:127:12)
      at net.js:1273:10

401请求以POST /login回复时,我很困惑为什么它会在200中回复。

使用Postman我可以创建user,以该用户身份登录,并通过PUT请求,我能够成功更新数据。所以,我假设这与req的{​​{1}}链接有关。

我使用supertest以及supertest-as-promised编写了请求链接。

据我所知,以下代码与使用supertest语法的行为相同:

then()

我对这里发生的事感到困惑。就像我说的那样,我可以使用it('should update username', function(done){ var _this = this; req.post('/login') .send(_this.data) .endfunction(err, res){ if(err) return done(err); req.put('/users/' + res.body.user._id) .send({ username: 'robert'}) .expect(200) .end(function(err, res){ if(err) return done(err); console.log(res.body); res.body.success.should.equal(true); res.body.user.username.should.match(/robert/); done(); }); }); }); 做到这一点,所以我想,这是请求链如何工作的问题。如果您需要更多上下文,我可以根据需要提供更多代码。

2 个答案:

答案 0 :(得分:1)

解决方案就像改变

一样简单

var req = require('supertest-as-promised')(app);

var req = require('supertest-as-promised').agent(app);

调用supertest.agent允许supertest作为网络会话工作,并在链接请求时保留会话,Cookie和标头。

答案 1 :(得分:0)

以下是我使用supertest代理的一些代码;

/*
    Authentication tests
*/
process.env.NODE_ENV = 'test'

var should = require('should'),
    app = require('../main.js'),
    supertest = require('supertest')


describe('authentication', function(){
    // I expose the webapp (express) on an object called app that is exported from main.js
    var agent = supertest.agent(app.webapp)

    before(function(cb){

        // Create a user (I expose my models on an object called app)
        var User = app.models.User
        var adminUser = new User({
            username : 'admin',
            password : 'admin',
            role : 'admin'
        })
        adminUser.save(function(err, _admin){
            should.not.exist(err)
            should.exist(_admin)        
            cb()
        })

    })

    describe('invalid user', function(){

        it('fail to login', function(cb){

            agent.post('/api/v1/login').send({ username : 'NEONE', password : '123'}).end(function(err,res){

                should(res.status).equal(401) // Unauthorised 
                cb()
            })

        })

        it('is not logged in', function(done){

            agent.get('/api/v1/loggedin').end(function(err, res){
                res.body.should.equal('0')
                done()              
            })

        })
    })

    describe('valid user', function(){

        it('should be able to login', function(done){

            agent.post('/api/v1/login').send({ username : 'admin', password : 'admin'}).end(function(err,res){
                should(res.status).equal(200) // Authorised
                done()
            })

        })

        it('should be logged in', function(done){

            agent.get('/api/v1/loggedin').end(function(err, res){
                should.not.exist(err)
                res.status.should.equal(200)
                res.body.username.should.equal('admin')
                done()              
            })

        })

        it('should be able to logout', function(done){

            agent.get('/api/v1/logout').end(function(err, res){
                res.status.should.equal(200)
                done()
            })

        })

        it('should not be logged in', function(done){

            agent.get('/api/v1/loggedin').end(function(err, res){
                res.body.should.equal('0')
                done()              
            })

        })

    })

})