--timeout, -t, --timeouts Specify test timeout threshold (in milliseconds)
[number] [default: 2000]
官方默认的超时是2000毫秒,即2s。
有三种方式来修改超时:
--no-timeout
参数或者debug
模式中,全局禁用了超时;
--timeout
后面接时间(毫秒),全局修改了本次执行测试用例的超时时间;
在测试用例里面,使用this.timeout
方法:
it('should take less than 500ms', function(done) {
this.timeout(500);
setTimeout(done, 300);
});
在钩子方法里面使用:
describe('a suite of tests', function() {
beforeEach(function(done) {
this.timeout(3000); // A very long environment setup.
setTimeout(done, 2500);
});
});
同样,可以使用``this.timeout(0)
去禁用超时。
Mocha在describe块之中,提供测试用例的四个钩子:before()、after()、beforeEach()和afterEach()。它们会在指定时间执行。
describe('测试index.js',()=> {
before(()=>console.info("在本区块的所有测试用例之前执行"))
after(()=>console.info("在本区块的所有测试用例之后执行"))
beforeEach(()=>console.info("在本区块的每个测试用例之前执行"))
afterEach(()=>console.info("在本区块的每个测试用例之后执行"))
describe('测试addNum函数', ()=> {
it('两数相加结果为两个数字的和', ()=> {
assert.equal(addNum(1,2),3)
})
})
})
Mocha本身是支持异步测试的。只需要为describe
回调函数添加一个done
参数, 成功时调用done()
,失败时调用done(err)
。例如:
var expect = require('chai').expect;
describe('db', function() {
it('#get', function(done) {
db.get('foo', function(err, foo){
if(err) done(err);
expect(foo).to.equal('bar');
done();
});
});
});
done
函数,Mocha会一直等待直到超时。done
参数,Mocha会直接返回成功,不会捕获到异步的断言失败。例如:it('#get', function(){
setTimeout(function(){
expect(1).to.equal(2);
}, 100);
});
运行上述测试Mocha总会提示Passing。
Mocha怎么知道是否要等待异步断言呢?因为JavaScript中的Function有一个
length
属性, 通过它可以获得该函数的形参个数。Mocha通过传入回调的length
来判断是否需要等待。
或者,done()
您可以返回Promise,而不是使用回调。如果您正在测试的API返回promises而不是回调,可以这样进行使用:
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);
});
});
同样,可以使用async / await,您还可以编写如下的异步测试:
beforeEach(async function() {
await db.clear();
await db.save([tobi, loki, jane]);
});
describe('#find()', function() {
it('responds with matching records', async function() {
const users = await db.find({type: 'User'});
users.should.have.length(3);
});
});
需要Babel支持~~~