钩子函数
优质
小牛编辑
129浏览
2023-12-01
其默认“BDD”式接口,mocha提供钩before()
,after()
,beforeEach()
,和afterEach()
。这些应该用于设置前置条件并在测试后进行清理。
describe('hooks', function() {
before(function() {
// runs before all tests in this block
});
after(function() {
// runs after all tests in this block
});
beforeEach(function() {
// runs before each test in this block
});
afterEach(function() {
// runs after each test in this block
});
// test cases
});
测试可以在钩子之前,之后或穿插时出现。钩子将按其定义的顺序运行,视情况而定; 所有
before()
钩子运行(一次),然后任何beforeEach()
钩子,测试,任何afterEach()
钩子,最后after()
钩子(一次)。
描述钩子
可以使用可选描述调用任何挂钩,从而更容易查明测试中的错误。如果为钩子指定了一个命名函数,则在没有提供描述的情况下将使用该名称。
beforeEach(function() {
// beforeEach hook
});
beforeEach(function namedFun() {
// beforeEach:namedFun
});
beforeEach('some description', function() {
// beforeEach:some description
});
异步挂钩
所有的钩子(before()
,after()
,beforeEach()
,afterEach()
)可以是同步或异步为好,表现就像一个常规的测试用例。例如,您可能希望在每次测试之前使用虚拟内容填充数据库:
describe('Connection', function() {
var db = new Connection,
tobi = new User('tobi'),
loki = new User('loki'),
jane = new User('jane');
beforeEach(function(done) {
db.clear(function(err) {
if (err) return done(err);
db.save([tobi, loki, jane], done);
});
});
describe('#find()', function() {
it('respond with matching records', function(done) {
db.find({type: 'User'}, function(err, res) {
if (err) return done(err);
res.should.have.length(3);
done();
});
});
});
});
根级挂钩
您也可以选择任何文件并添加“root”级别挂钩。例如,beforeEach()
在所有describe()
块之外添加。这将导致回调beforeEach()
在任何测试用例之前运行,无论它存在于哪个文件中(这是因为Mocha有一个隐含的 describe()
块,称为“根套件”)。
beforeEach(function() {
console.log('before every test in every file');
});
延迟根套件
如果您需要在运行任何套件之前执行异步操作,则可能会延迟根套件。mocha
用--delay
旗帜运行。这将附加一个特殊的回调函数run()
,到全局上下文:
setTimeout(function() {
// do some setup
describe('my suite', function() {
// ...
});
run();
}, 5000);