ASYNCHRONOUS CODE(异步代码)

使用mocha测试异步代码是再简单不过了。只需要在测试完成的时候调用一下回调函数即可。通过添加一个回调函数(通常命名为done)给it()方法,Mocha就会知道,它应该等这个函数被调用的时候才能完成测试。

  1. describe('User', function() {
  2. describe('#save()', function() {
  3. it('should save without error', function() {
  4. var user = new User('Luna')
  5. user.save(function(err) {
  6. if(err) done(err);
  7. else done()
  8. })
  9. })
  10. })
  11. })

也可以让事情变得更简单,因为done()函数接收一个err,所以,我们可以直接按照下面的使用:

  1. describe('User', function() {
  2. describe('#save()', function() {
  3. it('should save without error', function(done) {
  4. var user = new User('Luna')
  5. user.save(done)
  6. })
  7. })
  8. })

WORKING WITH PROMISES(使用promises)

同时,除了使用done()回调函数,你也可以返回一个Promise。这种方式对于测试那些返回promies的方法是实用的。

  1. beforeEach(function() {
  2. return db.clear()
  3. .then(function() {
  4. return db.save([tobi, loki, jane]);
  5. });
  6. });
  7. describe('#find()', function() {
  8. it('respond with matching records', function() {
  9. return db.find({ type: 'User' }).should.eventually.have.length(3);
  10. });
  11. });

后面的例子使用了Chai as Promised 进行promise断言

在Mocha>=3.0.0版本中,返回一个promise的同时,调用了done函数。将会导致一个异常,下面是一个常见的错误:

  1. const assert = require('assert')
  2. it('should complete this test', function (done) {
  3. return new Promise(function (resolve) {
  4. assert.ok(true)
  5. resolve()
  6. })
  7. .then(done)
  8. })

这个测试会失败,错误信息为:Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.
而比v3.0.0更老的版本中,调用done函数会被忽略。