如何在node.js中存根process.env?

问题描述 投票:0回答:8

我想用

process.env.FOO
存根
bar

var sinon = require('sinon');
var stub = sinon.stub(process.env, 'FOO', 'bar');

我很困惑。 我看了文档,但还是不太明白。sinonjs docs

sinonjs 就是一个例子,不是 sinonjs 也可以。

node.js stub sinon
8个回答
95
投票

根据我对

process.env
的理解,在设置其属性时,您可以像任何其他变量一样对待它。但请记住,
process.env
中的每个值都必须是字符串。因此,如果您在测试中需要特定值:

   it('does something interesting', () => {
      process.env.NODE_ENV = 'test';
      // ...
   });

为了避免将状态泄漏到其他测试中,请务必将变量重置为其原始值或完全删除它:

   afterEach(() => {
       delete process.env.NODE_ENV;
   });

29
投票

我能够通过克隆

process.env
并在拆卸方法中恢复它,在我的单元测试中正确地对其进行存根。

使用摩卡的示例

const env = Object.assign({}, process.env);

after(() => {
    process.env = env;
});

...

it('my test', ()=> {
    process.env.NODE_ENV = 'blah'
})

请记住,只有在您正在测试的函数中读取 process.env 时,这才有效。 例如,如果您正在测试的代码读取该变量并在闭包中使用它,它将不起作用。 您可能会使缓存的要求无效以正确测试它。

例如,以下内容不会对环境进行存根:

const nodeEnv = process.env.NODE_ENV;

const fnToTest = () => {
   nodeEnv ...
}

10
投票

使用 sinon 你可以像这样存根任何变量。

 const myObj = {
    example: 'oldValue', 
 };

 sinon.stub(myObj, 'example').value('newValue');

 myObj.example; // 'newValue'

这个例子是sinon文档的形式。 https://sinonjs.org/releases/v6.1.5/stubs/


有了这些知识,您就可以存根任何环境变量。 在你的情况下,它看起来像这样:

 let stub = sinon.stub(process.env, 'FOO').value('bar');

9
投票

如果您想存根 process.env 中不存在的密钥,可以使用此方法

const sinon = require('sinon')
let sandbox = sinon.createSandbox();
sandbox.stub(process, 'env').value({ 'SOME_KEY': 'SOME_VALUE' });

6
投票

如何在单元测试时快速模拟process.env。

https://glebbahmutov.com/blog/mocking-process-env/

const sinon = require('sinon')
let sandbox = sinon.createSandbox()

beforeEach(() => {
  sandbox.stub(process.env, 'USER').value('test-user')
})

it('has expected user', () => {
  assert(process.env.USER === 'test-user', 'wrong user')
})

afterEach(() => {
  sandbox.restore()
})

但是测试前 process.env 中可能不存在的属性怎么办?您可以使用以下包,然后您将能够测试不存在的环境变量。

https://github.com/bahmutov/mocked-env


4
投票

spec-helper.coffee
或类似的地方设置sinon沙箱,跟踪原始
process.env
并在每次测试后恢复它,这样你就不会在测试之间泄漏,也不必记住重置每个时间。

_ = require 'lodash'
sinon = require 'sinon'

beforeEach ->
    @originalProcessEnv = _.cloneDeep process.env

afterEach ->
    process.env = _.cloneDeep @originalProcessEnv

在测试中,照常使用

process.env

it 'does something based on an env var', ->
    process.env.FOO = 'bar'

0
投票

就像许多其他人指出的那样,除非您在测试开始之前设置了环境变量,否则 sinon 方式是有效的,例如在您正在测试的文件中,如下所示:

const foo = process.env.YOUR_VAR;

Gleb Bahmutov 编写了一个 npm 包,无论您如何引用环境变量,它都提供了一种在测试中设置环境变量的好方法。

链接到他的页面:https://glebbahmutov.com/blog/mocking-process-env/

npm 包链接:https://github.com/bahmutov/mocked-env

它效果很好,而且非常容易实施。


0
投票

出于测试目的,只需分配一个空字符串。

beforeEach(async () => {

  process.env.REDIS_SERVER = ''
  process.env.REDIS_PORT = ''
  sandbox.stub(process.env, 'REDIS_SERVER').value('localhost')
  sandbox.stub(process.env, 'REDIS_PORT').value('6379')
});

afterEach(async () => {
   sandbox.restore()
});
© www.soinside.com 2019 - 2024. All rights reserved.