Подтвердить что ты не робот

Как заглушить process.env в node.js?

Я хочу заглушить process.env.FOO с помощью "bar".

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

Я в замешательстве. Я прочитал документ, но все еще не понимаю. sinonjs docs

sinonjs - один из примеров, а не синоны в порядке.

4b9b3361

Ответ 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'