1

Я работаю над проектом, который использует значение в process.env.APP_ENV для того, чтобы выбрать необходимый Вам файл конфигурации для текущей среды:Тестирование модуля конфигурации с мокко, который зависит от переменной окружения process.env.APP_ENV

import prodParams from './production'; 
import stgParams from './staging'; 
import devParams from './development'; 

let params = devParams; 
switch (process.env.APP_ENV) { 
    case 'production': 
    params = prodParams; 
    break; 
    case 'staging': 
    params = stgParams; 
    break; 
    default: 
    params = devParams; 
} 

export default params; 

Я пытаюсь проверить это с помощью следующего кода (еще не с утверждениями):

import params from '../../../parameters'; 
... 

it.only('should return the appropriate config ', (done) => { 
    process.env.APP_ENV = 'production'; 
    console.log(params); 
    done(); 
}); 

Однако, когда я установил переменную окружения process.env.APP_ENV, как показано выше, он по-прежнему достигает модуль как неопределенная, поэтому он всегда возвращает развитие с onfig вместо рабочей среды.

Оставляя в стороне тестовую часть, функциональность работает нормально, но я бы хотел ее протестировать независимо.

Любые предложения о том, как исправить это?

+1

Я бы рекомендовал избегать полагаться на глобальные свойства, такие ' process.env' во всех ваших модулях. Прочитайте переменные среды в точке входа в приложение/тестовую установку и передайте их. В вашем 'parameters.js' экспортируйте' function', а не объект, который принимает в качестве аргумента среду для загрузки. – MarcoL

ответ

2

import заявления выполняются перед любым другим кодом, поэтому вы не можете сделать эту работу, используя import.

Вы можете несколько заставить его работать с require, если требуется параметры файла после вы установите переменную окружения:

process.env.APP_ENV = 'production'; 
let params = require('../../../parameters').default; 
... 

Однако, это еще не велика, потому что это» ll работает только один раз из-за кеша, который поддерживает require (последующий тест, который устанавливает APP_ENV на другое значение, не будет работать).

Обходной будет иметь parameters.js экспортировать функцию, что вы хотите позвонить:

// parameters.js 
export default function() { 
    let params = devParams; 
    switch (process.env.APP_ENV) { 
    ... 
    } 
    return params; 
} 

// test.js 
import getParams from '../../../parameters'; 
... 

process.env.APP_ENV = 'production'; 
let params = getParams(); 

Или установить APP_ENV внешне:

$ env APP_ENV='production' mocha ... 
+0

У меня есть та же проблема, и я «требую» скрипта тестируемого после изменения process.env. Тем не менее, я получаю значение, которое я установил через свой .bash_profile. Почему это? –