[英]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 中可能不存在的属性呢? 您可以使用以下包,然后您将能够测试不存在的环境变量。
在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.