为什么在 Jest 中将环境变量与未定义进行比较不能按预期工作?

Why does comparing an environment variable against undefined in Jest not work as expected?

虽然在 Jest 中实施一些测试以确保定义了所需的环境变量,但在尝试将环境变量与 undefined 进行比较时,我 运行 进入了一些 st运行ge 行为. @types/node 似乎暗示任何特定的环境变量都是 string | undefined,但实际上它似乎更复杂。

  process.env.TEST_VAR = 'TEST';

  console.log(process.env.TEST_VAR);    // TEST
  console.log(typeof process.env.TEST_VAR);    // string
  console.log(process.env.TEST_VAR === undefined);    // false
  console.log(!process.env.TEST_VAR);    // false
  console.log(process.env.TEST_VAR == undefined);    // false
  console.log(process.env.TEST_VAR === '');    // false

  process.env.TEST_VAR = '';

  console.log(process.env.TEST_VAR);    // 
  console.log(typeof process.env.TEST_VAR);    // string
  console.log(process.env.TEST_VAR === undefined);    // false
  console.log(!process.env.TEST_VAR);    // true
  console.log(process.env.TEST_VAR == undefined);    // false
  console.log(process.env.TEST_VAR === '');    // true

  process.env.TEST_VAR = undefined;

  console.log(process.env.TEST_VAR);    // undefined
  console.log(typeof process.env.TEST_VAR);    // string
  console.log(process.env.TEST_VAR === undefined);    // false
  console.log(!process.env.TEST_VAR);    // false
  console.log(process.env.TEST_VAR == undefined);    // false
  console.log(process.env.TEST_VAR === '');    // false

我知道这可能有点迂腐,但是在我们的特定用例中,变量 empty 和变量 absent[=22] 之间存在差异=]. 运行 node 在命令行上,实际上引用任何未定义的环境变量 returns undefined。 有谁知道为什么会这样?以及如何真正测试未定义的环境变量与空变量之间的区别?

它是这样定义的:

interface Process extends EventEmitter {
  ...
  env: ProcessEnv;
  ...
}
interface ProcessEnv extends Dict<string> {
  TZ?: string;
}
interface Dict<T> {
  [key: string]: T | undefined;
}

同样在你的测试中,你得到了为什么你不能将值与未定义的值进行比较的答案。

  console.log(process.env.TEST_VAR);    // undefined
  console.log(typeof process.env.TEST_VAR);    // string

即使你想把 undefined 放在那里,你实际上还是放了 'undefined'

将此添加到您的测试中

    delete process.env.TEST_VAR;
    
    console.log(process.env.TEST_VAR);    // undefined
    console.log(typeof process.env.TEST_VAR);    // undefined
    console.log(process.env.TEST_VAR === undefined);    // true
    console.log(!process.env.TEST_VAR);    // true
    console.log(process.env.TEST_VAR == undefined);    // true
    console.log(process.env.TEST_VAR === '');    // false

这就是你为环境变量设置未定义值的方式