javascript - 当我循环测试用例时,为什么 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
and之外进行重新分配工作it
?
解决方案
该行没有被跳过,但即使在第一个测试运行之前,它也会在循环中的每次迭代中执行。在循环完成之前,测试框架不会运行任何测试,这意味着process.env.NODE_ENV
在第一个测试运行时具有最后一次迭代的值。
您的代码只描述了测试,它是执行它们的框架,它是异步执行的。这就是为什么您需要将该行放在实际测试中的原因。
与其说是语言如何工作,不如说是 Mocha 测试框架是如何设计的。
推荐阅读
- javascript - 如何使用JavascriptInterface将Android的Alert返回值返回给WebView?
- javascript - 具有 D3 (v4) 直方图函数的肥尾意味着空箱
- javascript - 更改表单操作位置
- logstash - Wso2carbon 使用 tcp 输入插件记录 2 个 logstash,没有 filebeat
- laravel - 更新在 Laravel 中不起作用,如果我使用的文本框名称与数据库中的列名称不同
- react-native - 我如何使用副驾驶来响应本机导航?
- c# - EPPlus:数据透视表列中的值
- javascript - 在 React 中使用文件中的 JavaScript 变量
- javascript - 当收音机改变时,更新选择相同的值
- symfony - 如何安装 composer.json 中定义的 packages-dev