ASYNCHRONOUS CODE(异步代码)
使用mocha测试异步代码是再简单不过了。只需要在测试完成的时候调用一下回调函数即可。通过添加一个回调函数(通常命名为done
)给it()
方法,Mocha就会知道,它应该等这个函数被调用的时候才能完成测试。
describe('User', function() {
describe('#save()', function() {
it('should save without error', function() {
var user = new User('Luna')
user.save(function(err) {
if(err) done(err);
else done()
})
})
})
})
也可以让事情变得更简单,因为done()
函数接收一个err,所以,我们可以直接按照下面的使用:
describe('User', function() {
describe('#save()', function() {
it('should save without error', function(done) {
var user = new User('Luna')
user.save(done)
})
})
})
WORKING WITH PROMISES(使用promises)
同时,除了使用done()
回调函数,你也可以返回一个Promise。这种方式对于测试那些返回promies的方法是实用的。
beforeEach(function() {
return db.clear()
.then(function() {
return db.save([tobi, loki, jane]);
});
});
describe('#find()', function() {
it('respond with matching records', function() {
return db.find({ type: 'User' }).should.eventually.have.length(3);
});
});
后面的例子使用了Chai as Promised 进行promise断言
在Mocha>=3.0.0版本中,返回一个promise的同时,调用了done函数。将会导致一个异常,下面是一个常见的错误:
const assert = require('assert')
it('should complete this test', function (done) {
return new Promise(function (resolve) {
assert.ok(true)
resolve()
})
.then(done)
})
这个测试会失败,错误信息为:Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.
而比v3.0.0更老的版本中,调用done函数会被忽略。