没有测试的程序是不完整的,现在我们来编写测试用例,首先通过:

npm i mocha co-mocha co-supertest --save-dev

安装测试依赖的模块。然后修改 app.js,将:

app.listen(config.port, function () {
  console.log('Server listening on: ', config.port);
});

修改为:

if (module.parent) {
  module.exports = app.callback();
} else {
  app.listen(config.port, function () {
    console.log('Server listening on: ', config.port);
  });
}

这里通过 module.parent 判断该文件是否被引用,被引用则导出 app.callback() 以供测试,否则通过 app.listen 启动程序。以 signup 为例,我们来看看如何编写测试用例,其余的读者可自行完成。新建 test/signup.js,添加如下代码:

var User = require('../models').User;
var request = require('co-supertest');
var app = require('../app');

describe('/signup', function () {
  var agent = request.agent(app);

  before(function (done) {
    User.remove({name: 'nswbmw'}, done);
  });

  after(function (done) {
    User.remove({name: 'nswbmw'}, done);
  });

  it('GET /signup without cookie', function* () {
    yield agent.get('/signup').expect(200).end();
  });

  it('POST /signup without cookie', function* () {
    yield agent
      .post('/signup')
      .send({
        name: 'nswbmw',
        email: 'nswbmw@example.com',
        password: '123456',
        re_password: '123456',
        gender: '男',
        signature: '你是我的小呀小苹果~'
      })
      .expect(302)
      .end();
  });

  it('GET /signup with cookie', function* () {
    yield agent.get('/signup').expect(302).end();
  });

  it('POST /signup with cookie', function* () {
    yield agent
      .post('/signup')
      .send({
        name: 'nswbmw',
        email: 'nswbmw@example.com',
        password: '123456',
        re_password: '123456',
        gender: '男',
        signature: '你是我的小呀小苹果~'
      })
      .expect(302)
      .end();
  });
});

这里我们通过 var agent = request.agent(app) 使得之后每次请求(agent.getagent.post 等)都带上 cookies,before()after() 分别用来在测试前和测试后清理测试数据。最后,修改根目录下的 package.json,在 scripts 中添加:

"test": "./node_modules/mocha/bin/mocha --require co-mocha"

运行以下命令进行测试:

npm test