您应该使用
--delay选项运行Mocha ,然后
run()在完成测试套件的构建后再使用。这是从您在问题中显示的代码派生的示例:
'use strict';function test() { console.log(1); describe('Unit Testing', () => { console.log(2); it("test", () => { console.log(3); }); }); // You must use --delay for `run()` to be available to you. run();}setTimeout(test, 1000);我
setTimeout用来模拟异步操作。使用
--delay和
run()允许您构建作为异步计算结果的套件。但是请注意,套件必须一次性构建。(您不能在内部使用异步进程
describe进行调用
it。这将无法工作。)
你绝对不应该做的一件事就是rob3c的建议:从一个钩子内部调用
describe或
it(或两者)。这是每个人不时犯的错误,因此值得详细解决。问题是Mocha不支持它,因此没有与调用
describe或
it挂钩内部相关的已建立语义。哦,有可能写一些简单的示例,这些示例可以按预期工作,但是:
当套件变得更加复杂时,套件的行为不再对应于任何明智的行为。
由于没有与此方法相关的语义,因此较新的Mocha版本可能会以不同的方式处理错误用法并破坏套件。
考虑以下简单示例:
const assert = require("assert");const p = Promise.resolve(["foo", "bar", "baz"]);describe("top", () => { let flag; before(() => { flag = true; return p.then((names) => { describe("embedded", () => { for (const name of names) { it(name, () => { assert(flag); }); } }); }); }); after(() => { flag = false; }); it("regular test", () => { assert(flag); });});当我们运行它时,我们得到:
top ✓ regular test embedded 1) foo 2) bar 3) baz 1 passing (32ms) 3 failing // [stack traces omitted for brevity]
这里发生了什么?所有的测试不应该通过吗?我们设置
flag以
true在
before钩的
top描述。我们在其中创建的所有测试都应该显示
flag为
true,否?线索就在上面的输出中:当我们在一个钩子中创建测试时,Mocha会将测试
放在某个地方, 但是它可能不在反映
describe代码中块结构的位置。 在这种情况下
,发生的事情是Mocha只是将在钩子中创建的测试附加到套件的末尾,而不是
topdescribe的末尾,因此该
after钩子在动态创建的测试之前运行,并且我们得到了违反直觉的结果。
使用
--delay和
run(),我们可以编写一个行为与直觉一致的套件:
const assert = require("assert");const p = Promise.resolve(["foo", "bar", "baz"]).then((names) => { describe("top", () => { let flag; before(() => { flag = true; }); after(() => { flag = false; }); describe("embedded", () => { for (const name of names) { it(name, () => { assert(flag); }); } }); it("regular test", () => { assert(flag); }); }); run();});输出:
top ✓ regular test embedded ✓ foo ✓ bar ✓ baz 4 passing (19ms)



