为什么当我循环测试用例时,Mocha 会跳过重新分配变量?
Why does Mocha skip reassigning the variable when I loop over test cases?
我正在寻找 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
之外进行重新分配?
该行没有被跳过,但它在循环中的每次迭代中都被执行,甚至在第一个测试 运行 之前。在循环完成之前,测试框架不会 运行 您的任何测试,这意味着 process.env.NODE_ENV
具有第一个测试 运行 时最后一次迭代的值。
您的代码仅描述测试,是执行测试的框架,并且是异步执行的。这就是为什么您需要将该行放在实际测试中。
这与其说是语言如何工作的问题,不如说是 Mocha 测试框架的设计方式。
我正在寻找 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
之外进行重新分配?
该行没有被跳过,但它在循环中的每次迭代中都被执行,甚至在第一个测试 运行 之前。在循环完成之前,测试框架不会 运行 您的任何测试,这意味着 process.env.NODE_ENV
具有第一个测试 运行 时最后一次迭代的值。
您的代码仅描述测试,是执行测试的框架,并且是异步执行的。这就是为什么您需要将该行放在实际测试中。
这与其说是语言如何工作的问题,不如说是 Mocha 测试框架的设计方式。