首页 > 解决方案 > 当我循环测试用例时,为什么 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 的异步特性有关。

请解释为什么第一行被跳过而第二行有效。如何在describeand之外进行重新分配工作it

标签: javascriptnode.jsasynchronousmocha.jschai

解决方案


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

您的代码只描述了测试,它是执行它们的框架,它是异步执行的。这就是为什么您需要将该行放在实际测试中的原因。

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


推荐阅读