簡體   English   中英

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

[英]How to stub process.env in node.js?

我想用bar存根process.env.FOO

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

我糊塗了。 我閱讀了文檔,但我仍然不明白。 sinonjs 文檔

sinonjs 就是一個例子,不是 sinonjs 是可以的。

根據我對process.env理解,在設置其屬性時,您可以像對待任何其他變量一樣簡單地對待它。 但是請記住, process.env中的每個值都必須是字符串。 因此,如果您在測試中需要特定值:

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

為避免將狀態泄漏到其他測試中,請確保將變量重置為其原始值或將其完全刪除:

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

通過克隆它並在拆卸方法中恢復它,我能夠在我的單元測試中正確地存根process.env

使用 Mocha 的示例

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

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

...

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

請記住,這僅在 process.env 僅在您正在測試的函數中被讀取時才有效。 例如,如果您正在測試的代碼讀取變量並在閉包中使用它,它將不起作用。 您可能會使緩存的要求無效以正確測試。

例如,以下不會對 env 進行存根:

const nodeEnv = process.env.NODE_ENV;

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

使用 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');

如何在單元測試期間快速模擬 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

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'

如果您想存根 process.env 中不存在的密鑰,則可以使用它

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

就像許多其他人指出的一樣,除非您在測試開始之前設置了環境變量,否則 sinon 方式是有效的,例如在您正在測試的文件中,如下所示:

const foo = process.env.YOUR_VAR;

Gleb Bahmutov 編寫了一個 npm 包,無論您如何引用環境變量,它都提供了一種在測試中設置環境變量的好方法。

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

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

它工作得很好並且非常容易實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM