问题
I want to stub process.env.FOO
with bar
.
var sinon = require('sinon');
var stub = sinon.stub(process.env, 'FOO', 'bar');
I'm confused. I read document, but still I don't understand yet.sinonjs docs
sinonjs is one example, not sinonjs is okay.
回答1:
From my understanding of process.env
, you can simply treat it like any other variable when setting its properties. Keep in mind, though, that every value in process.env
must be a string. So, if you need a particular value in your test:
it('does something interesting', () => {
process.env.NODE_ENV = 'test';
// ...
});
To avoid leaking state into other tests, be sure to reset the variable to its original value or delete it altogether:
afterEach(() => {
delete process.env.NODE_ENV;
});
回答2:
I was able to get process.env
to be stubed properly in my unit tests by cloning it and in a teardown method restoring it.
Example using Mocha
const env = Object.assign({}, process.env);
after(() => {
process.env = env;
});
...
it('my test', ()=> {
process.env.NODE_ENV = 'blah'
})
Keep in mind this will only work if the process.env is only being read in the function you are testing. For example if the code that you are testing reads the variable and uses it in a closure it will not work. You probably invalidate the cached require to test that properly.
For example the following won't have the env stubbed:
const nodeEnv = process.env.NODE_ENV;
const fnToTest = () => {
nodeEnv ...
}
回答3:
In a spec-helper.coffee
or something similar where you set up your sinon sandbox, keep track of the original process.env
and restore it after each test, so you don't leak between tests and don't have to remember to reset every time.
_ = require 'lodash'
sinon = require 'sinon'
beforeEach ->
@originalProcessEnv = _.cloneDeep process.env
afterEach ->
process.env = _.cloneDeep @originalProcessEnv
In your test, use process.env
as normal.
it 'does something based on an env var', ->
process.env.FOO = 'bar'
回答4:
With sinon you can stub any variable like this.
const myObj = {
example: 'oldValue',
};
sinon.stub(myObj, 'example').value('newValue');
myObj.example; // 'newValue'
This example is form sinon documentation. https://sinonjs.org/releases/v6.1.5/stubs/
With that knowledge, you can stub any environment variable. In your case it would look like this:
let stub = sinon.stub(process.env, 'FOO').value('bar');
来源:https://stackoverflow.com/questions/24589021/how-to-stub-process-env-in-node-js