钩子函数

优质
小牛编辑
117浏览
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);