Skip to content
On this page

supertest请求测试

在 node 业务应用中,我们经常需要测试路由的可用性,如何处理呢?

可以使用 supertest 模块,supertest 专门用于 http 断言,支持 koa 的 http 请求测试。

为了保证应用的可测试性,我们需要把应用脚本比如 app.js 中的 koa 实例暴露出来:

javascript
var koa = require('koa');
    var app = koa();
    //一堆中间件...
    module.exports = app;

用例写法:

javascript
var superagent = require('supertest');
    var app = require('../app');
    
    function request() {
        return superagent(app.listen());
    }
    
    describe('Routes', function () {
        describe('GET /', function () {
            it('should return 200', function (done) {
                request()
                    .get('/')
                    .expect(200, done);
            });
        });
    });

superagent(app.listen()) 会截获 koa 的 http 请求,可以使用 get 、 post 等方法,对请求进行测试。

javascript
request()
        .get('/')
        .expect(200, done);

get('/') 即测试首页 get 请求,.expect(200, done) 测试 请求状态码是否为 200 (请求成功),done 是必须传入的,这样请求测试结束后,才能把测试信息推送给mocha处理。

上述测试代码等价于:

javascript
request()
        .get('/')
        .expect(200)
        .end(function(err, res){
            if (err) return done(err);
            done();
        });

.end() 回调会在请求完成后触发,可以在回调中对错误进行处理,res 包含完整的请求信息,可以对这些信息进行测试,比如页面输出的内容等。

运行命令 :

mocha --harmony

留意:测试 koa 的请求必须加--harmony,否者会抛异常。

我们经常需要对 json 接口的数据结构合法性进行测试,如何借助 supertest 实现测试呢?

我们新建个 /api/user/:id 的路由,返回一个用户信息:

javascript
app.get('/api/user/:id',function *(){
        var user = {name:'minghe',email:'[email protected]'};
        user = JSON.stringify(user);
        this.body = user;
    })

测试此路由是否返回正确的数据:

javascript
it('should be json',function(done){
        request()
            .get('/api/user/1')
            .expect(200)
            .end(function(err, res){
                if (err) return done(err);
                var text = res.text;
                var json = JSON.parse(text);
                json.should.have.property('email');
                json.should.have.property('minghe');
                done();
            });
    })

supertest 很强大,可以设置请求的头信息,使用 set() :

javascript
request()
        .get('/')
        .set('Accept', 'application/json')
        .expect('Content-Type', /json/)

而 expect() 除了支持状态码测试外,还支持头信息测试:.expect('Content-Type', /json/) 。