gpt4 book ai didi

node.js - 如何异步构建我的测试套件?

转载 作者:太空宇宙 更新时间:2023-11-04 00:37:41 24 4
gpt4 key购买 nike

我正在尝试使用必须异步加载的配置为我的 Controller 创建 Mocha 测试。下面是我的代码。但是,当运行 mocha 测试时,它不会运行任何测试,显示 0 passing。 console.log 甚至从未被调用。我尝试在描述中执行 before(next => config.build().then(next)) ,但即使测试运行,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 suggests :从钩子(Hook)内部调用describeit(或两者)。这是人们时常犯的错误,因此值得详细解决。问题是 Mocha 不支持它,因此没有与从钩子(Hook)内部调用 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]

这是怎么回事?不是所有的测试都应该通过吗?我们在 top 描述的 before Hook 中将 flag 设置为 true。我们在其中创建的所有测试都应该将 flag 视为 true,不是吗?线索就在上面的输出中:当我们在钩子(Hook)内创建测试时,Mocha 会将测试放在某处,但它可能不会位于反射(reflect)代码中 describe block 结构的位置。在这种情况下,Mocha 只是将钩子(Hook)中创建的测试附加到套件的最后,在 top 描述之外,因此 after 钩子(Hook)在动态创建的测试之前运行,我们得到了一个违反直觉的结果。

使用--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)

关于node.js - 如何异步构建我的测试套件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38268435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com