当我循环测试用例时,为啥 Mocha 会跳过重新分配变量?

Posted

技术标签:

【中文标题】当我循环测试用例时,为啥 Mocha 会跳过重新分配变量?【英文标题】:Why does Mocha skip reassigning the variable when I loop over test cases?当我循环测试用例时,为什么 Mocha 会跳过重新分配变量? 【发布时间】:2019-11-24 16:18:13 【问题描述】:

我正在寻找有关 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 之外进行重新分配工作?

【问题讨论】:

it() 是异步的吗? 你怎么知道它被跳过了,因为你在第二行设置了同样的东西? @Barmar 这是 mocha 测试框架。他们的文档mochajs.org/api/mocha 没有具体说明。 发布不起作用的代码,不要混入改变行为的代码。 你需要将process.env.NODE_ENV = environment移动到实际测试中。在循环完成之前,测试框架不会运行任何测试,这意味着 var 甚至在第一次测试运行之前就具有最后一次迭代的值。您的代码只描述了测试,它是执行它们的框架,并且它是异步执行的。与其说是语言如何工作,不如说是测试框架是如何设计的。 【参考方案1】:

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

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

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

【讨论】:

以上是关于当我循环测试用例时,为啥 Mocha 会跳过重新分配变量?的主要内容,如果未能解决你的问题,请参考以下文章

当我在 Eclipse 中运行 Junit 测试用例时,出现错误

当我尝试运行测试用例时,它显示了 shallowMount 错误,如何修复 VUE.JS 中的 ShallowMount 错误?

当我运行测试用例时,实体管理器已成功注入,但在运行 Web 应用程序时抛出 NullPointerException

当生产功能可能有数百万个测试用例时,TDD 是如何工作的?

当我运行测试用例时,出现此错误: psycopg2.OperationalError: cursor "_django_curs_140351416325888_23" does

在套件中运行测试用例时在 XML testng 文件中出现错误