如何异步构建测试套件?

我正在尝试使用必须异步加载的配置为我的控制器创建摩卡测试。下面是我的代码。但是,运行mocha测试时,它不会运行任何测试,显示为0

passing。该console.logs的甚至从来没有叫。我尝试before(next =>

config.build().then(next))在describe内执行操作,但是即使运行测试,before也从未调用过。有没有一种方法可以在运行任何测试之前一次加载配置?

'use strict';

const common = require('./common');

const config = require('../config');

config

.build()

.then(test);

function test() {

console.log(1);

describe('Unit Testing', () => {

console.log(2);

require('./auth');

});

}

回答:

您应该使用--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用来模拟异步操作。使用--delayrun()允许您构建作为异步计算结果的套件。但是请注意,套件必须一次性构建。(您不能在内部使用异步进程describe进行调用it。这将无法工作。)


你绝对不应该做的一件事就是rob3c的建议:从一个钩子内部调用describeit(或两者)。这是每个人不时犯的错误,因此值得详细解决。问题是Mocha不支持它,因此没有与调用describeit挂钩内部相关的已建立语义。哦,有可能写一些简单的示例,这些示例可以按预期工作,但是:

  1. 当套件变得更加复杂时,套件的行为不再对应于任何明智的行为。

  2. 由于没有与此方法相关的语义,因此较新的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]

这里发生了什么?所有的测试不应该通过吗?我们设置flagtruebefore钩的top描述。我们在其中创建的所有测试都应该显示flagtrue,否?线索就在上面的输出中:当我们在一个钩子中创建测试时,Mocha会将测试

放在某个地方, 但是它可能不在反映describe代码中块结构的位置。 在这种情况下

,发生的事情是Mocha只是将在钩子中创建的测试附加到套件的末尾,而不是topdescribe的末尾,因此该after钩子在动态创建的测试之前运行,并且我们得到了违反直觉的结果。

使用--delayrun(),我们可以编写一个行为与直觉一致的套件:

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)

以上是 如何异步构建测试套件? 的全部内容, 来源链接: utcz.com/qa/402533.html

回到顶部