美文网首页Koa饥人谷技术博客程序员
Mocha, Chai, Supertest 对 Koajs 系

Mocha, Chai, Supertest 对 Koajs 系

作者: solee | 来源:发表于2016-03-30 14:43 被阅读1333次
    Unit Testing

    利用Mocha,Chai和Supertest对我们的Koajs工程的每个API进行单元测试。

    模块准备

    因为Koajs对ES6 generator的支持。所以在选择模块的时候需要选择相应的co封装模块。

    • mocha 和 co-mocha
    • chai
    • supertest 和 co-supertest
    npm install mocha co-mocha supertest co-supertest chai --save-dev
    

    至于 MochaKarma 的选择这里就不再讨论了 :)

    开始测试

    co-mocha 引用

    package.json中修改test script为:

    "test": "mocha --harmony --require co-mocha"
    

    或者在测试文件中插入:

    require('co-mocha');
    

    测试代码编写

    创建测试文件solee.test.js.

    首先在运行测试前需要,写入一些必要的环境变量:

    process.env.NODE_ENV = 'test';
    process.env.DATABASE = 'mysql://********'
    

    然后引用我们的Koajs项目和相应模块。我们Koajs工程入口放在lib\index.js,并且注意co-supertest的引用方式:

    var app = require('../lib');
    var request = require('co-supertest').agent(app.listen());
    var should = require('chai').should();
    

    describe描述我们需要测试的大概内容之后,在it中开始写测试代码。因为会使用ES6的yield方式所以function需要加入*

    it('should return list of details with exist user', function *() {
        ···
    }
    

    利用co-supertest访问我们提供的api接口。可以直接调用内置expect去做一些验证过滤,例如:Content-Type是json,返回码是200等:

    var res = yield request
            .get('/points/point/3/details')
            .set('Accept', 'application/json')
            .expect('Content-Type', /json/)
            .expect(200)
            .end();
    

    拿到返回内容res.text,再利用Chaishould模块对返回内容进行验证。

    var body = JSON.parse(res.text);
          body.should.have.deep.property('data.list_points').length.above(0);
          body.should.have.deep.property('data.total_points').above(0);
    

    最后运行npm test就可以看到对一个API简单单元测试的结果了。

    测试结果

    总结

    我们可以对一个API进行各种情况的单元测试,但是为了补充我们没有想到的情况,可以辅以测试的覆盖率来发现我们的功能是否完善。而覆盖率使用 istanbul 感觉爽爽的。

    npm install -g istanbul
    
    istanbul cover _mocha
    

    _mocha前面的下划线不能省。

    题外话

    我开始写测试的时候老是不成功,读取不到Koa工程app,最后发现是以下代码惹的祸:

    http.createServer(app.callback()).listen(process.env.PORT || 3333);
    

    修改成:

    app.listen(process.env.PORT || 3333);
    

    就OK了

    相关文章

      网友评论

      • stutterr:请问post测试怎么写?。
        EasyValley:describe('请求/photo/add', () => {
        it('添加照片', (done) => {
        request(app.listen())
        .post('/photo/add')
        .send({
        "metadata": {
        "height": 640,
        "width": 480,
        "compressed": true,
        "comment": "我测试添加大哈哈哈",
        "orientation": "portait",
        "photo": {
        "name": "测试mocha大乔",
        "description": "I am near polar bears",
        "filename": "photo-with-bears.jpg",
        "isPublished": true,
        "views": 100
        }
        }
        })
        .expect(200)
        .end(done);
        })
        });

      本文标题:Mocha, Chai, Supertest 对 Koajs 系

      本文链接:https://www.haomeiwen.com/subject/ebtelttx.html