为什么当我循环测试用例时,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 的异步性质有关。

请解释为什么跳过第一行而第二行有效。如何在 describeit 之外进行重新分配?

该行没有被跳过,但它在循环中的每次迭代中都被执行,甚至在第一个测试 运行 之前。在循环完成之前,测试框架不会 运行 您的任何测试,这意味着 process.env.NODE_ENV 具有第一个测试 运行 时最后一次迭代的值。

您的代码仅描述测试,是执行测试的框架,并且是异步执行的。这就是为什么您需要将该行放在实际测试中。

这与其说是语言如何工作的问题,不如说是 Mocha 测试框架的设计方式。