【发布时间】:2023-03-15 22:43:02
【问题描述】:
我正在寻找有关 JavaScript 或 Node.js 内部工作原理的解释。我有这个单元测试:
const assert = require("assert");
const expect = require("chai").expect;
process.env.NODE_ENV = "development";
const run = ["development", "production"];
for (const environment of run) {
// $first line: this code is skipped on the second "production" run causing the test to fail
process.env.NODE_ENV = environment;
describe(`in ${environment} mode`, () => {
it(`process.env.NODE_ENV should be '${environment}'`, () => {
// $second line: When I add the following line, the test is successful
// process.env.NODE_ENV = environment;
expect(process.env.NODE_ENV).to.equal(environment);
});
// more test cases dependant on environment
}
在我的 Node.js 环境中,第二个 process.env.NODE_ENV = environment; 在执行期间总是被跳过。我来自 Java 背景。在 Java 中,我从来没有在单线程环境中跳过代码的经验。我认为这与 Javascript 的异步特性有关。
请解释为什么第一行被跳过而第二行起作用。如何在 describe 和 it 之外进行重新分配工作?
【问题讨论】:
-
it()是异步的吗? -
你怎么知道它被跳过了,因为你在第二行设置了同样的东西?
-
@Barmar 这是 mocha 测试框架。他们的文档mochajs.org/api/mocha 没有具体说明。
-
发布不起作用的代码,不要混入改变行为的代码。
-
你需要将
process.env.NODE_ENV = environment移动到实际测试中。在循环完成之前,测试框架不会运行任何测试,这意味着 var 甚至在第一次测试运行之前就具有最后一次迭代的值。您的代码只描述了测试,它是执行它们的框架,并且它是异步执行的。与其说是语言如何工作,不如说是测试框架是如何设计的。
标签: javascript node.js asynchronous mocha.js chai