第一个带有before
钩子的代码片段返回一个Promise并调用done
。在Mocha 3.x及以上版本中,这将导致以下错误:
Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.
过去使用
done
并返回一个promise可能并不重要,但最终Mocha开发人员认为同时指定
done
和返回promise只意味着测试设计师犯了一个错误,更好的做法是让Mocha抛出异常而不是默默地允许它。
在你的第二个代码片段中,你有done
参数和返回一个promise,但Mocha仍然会等待done
被调用并超时。(实际上它应该检测到参数并像第一种情况那样引发错误,但它没有...)
通常,如果你正在测试产生promise的异步操作,最简单的方法是返回promise而不是使用done
。下面是一个说明问题的例子:
const assert = require("assert");
it("something not tested properly", (done) => {
Promise.resolve(1).then((x) => {
assert.equal(x, 2);
done();
});
});
it("something tested properly", (done) => {
Promise.resolve(1).then((x) => {
assert.equal(x, 2);
done();
}).catch(done);
});
it("something tested properly but much simpler", () => {
return Promise.resolve(1).then((x) => {
assert.equal(x, 2);
});
});
关于异步操作的完成,无论是使用 it
, before
, beforeEach
, after
还是 afterEach
,它们的工作方式是相同的。因此,即使我给出的示例是使用 it
,所有钩子都适用于该示例。