Как заглушить process.env в node.js?
Я хочу заглушить process.env.FOO с помощью "bar".
var sinon = require('sinon');
var stub = sinon.stub(process.env, 'FOO', 'bar');
Я в замешательстве.
Я прочитал документ, но все еще не понимаю. sinonjs docs
sinonjs - один из примеров, а не синоны в порядке.
Ответы
Ответ 1
Из моего понимания process.env
вы можете просто рассматривать его как любую другую переменную при настройке своих свойств. Имейте в виду, что каждое значение в process.env
должно быть строкой. Итак, если вам нужно определенное значение в вашем тесте:
it('does something interesting', () => {
process.env.NODE_ENV = 'test';
// ...
});
Чтобы избежать утечки состояния в другие тесты, обязательно reset переменная к ее исходному значению или вообще удалите ее:
afterEach(() => {
delete process.env.NODE_ENV;
});
Ответ 2
Мне удалось получить process.env
, чтобы он был правильно закодирован в моих модульных тестах, клонировав его и восстановив его методом слежения.
Пример использования Mocha
const env = Object.assign({}, process.env);
after(() => {
process.env = env;
});
...
it('my test', ()=> {
process.env.NODE_ENV = 'blah'
})
Помните, что это будет работать, только если process.env будет прочитан только в тестируемой функции. Например, если код, который вы тестируете, читает переменную и использует ее в закрытии, она не будет работать. Вероятно, вы, вероятно, сделаете недействительным требование кэширования для надлежащего тестирования.
Например, следующее не будет иметь env stubbed:
const nodeEnv = process.env.NODE_ENV;
const fnToTest = () => {
nodeEnv ...
}
Ответ 3
В spec-helper.coffee
или что-то подобное, когда вы настраиваете свою изолированную песочницу sinon, отслеживайте оригинал process.env
и восстанавливайте его после каждого теста, поэтому вы не просачиваетесь между тестами и не должны запоминать reset каждый раз.
_ = 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'