[node.js] Jest로 process.env 테스트

다음과 같은 환경 변수에 의존하는 앱이 있습니다.

const APP_PORT = process.env.APP_PORT || 8080;

예를 들어 테스트하고 싶습니다.

  • APP_PORT는 node env 변수로 설정할 수 있습니다.
  • 또는 express앱이 다음으로 설정된 포트에서 실행 중임을process.env.APP_PORT

Jest로 어떻게 할 수 있습니까? process.env각 테스트 전에 이러한 변수를 설정할 수 있습니까 ? 아니면 어떻게 든 조롱해야합니까?



답변

내가 한 방식 은이 SO 질문에서 찾을 수 있습니다 .

각 테스트 전에 resetModules 를 수행 한 다음 테스트 내에서 모듈을 동적으로 가져 오는 것이 중요합니다 .

describe('environmental variables', () => {
  const OLD_ENV = process.env;

  beforeEach(() => {
    jest.resetModules() // most important - it clears the cache
    process.env = { ...OLD_ENV }; // make a copy
  });

  afterAll(() => {
    process.env = OLD_ENV; // restore old env
  });

  test('will receive process.env variables', () => {
    // set the variables
    process.env.NODE_ENV = 'dev';
    process.env.PROXY_PREFIX = '/new-prefix/';
    process.env.API_URL = 'https://new-api.com/';
    process.env.APP_PORT = '7080';
    process.env.USE_PROXY = 'false';

    const testedModule = require('../../config/env').default

    // ... actual testing
  });
});

Jest를 실행하기 전에 env 값을로드하는 방법을 찾으면 아래 답변을 찾으 십시오 . 이를 위해 setupFiles 를 사용해야 합니다.


답변

Jest setupFiles는이를 처리하는 적절한 방법이며 , 작동하도록을 설치 dotenv하거나 .env파일을 전혀 사용할 필요가 없습니다 .

jest.config.js:

module.exports = {
  setupFiles: ["<rootDir>/.jest/setEnvVars.js"]
};

.jest/setEnvVars.js:

process.env.MY_CUSTOM_TEST_ENV_VAR = 'foo'

그게 다야.


답변

에서 ./package.json:

"jest": {
  "setupFiles": [
    "<rootDir>/jest/setEnvVars.js"
  ]
}

에서 ./jest/setEnvVars.js:

process.env.SOME_VAR = 'value';


답변

setupFilesjest 구성의 기능을 사용할 수 있습니다 . 로 문서를했다 , 그

테스트 환경을 구성하거나 설정하기 위해 일부 코드를 실행하는 모듈에 대한 경로 목록입니다. 각 setupFile은 테스트 파일 당 한 번씩 실행됩니다. 모든 테스트는 자체 환경에서 실행되기 때문에 이러한 스크립트는 테스트 코드 자체를 실행하기 직전에 테스트 환경에서 실행됩니다.

  1. npm install dotenv env 변수에 액세스하는 데 사용하는 dotenv.
  2. 당신의 작성 .env응용 프로그램의 루트 디렉토리에 파일을하고 그것으로이 줄을 추가합니다.
#.env
APP_PORT=8080
  1. 이름이 someModuleForTest.js 인 사용자 지정 모듈 파일을 만들고이 줄을 추가합니다.
//someModuleForTest.js
require("dotenv").config()
  1. 다음 jest.config.js과 같이 파일을 업데이트하십시오.
module.exports = {
  setupFiles: ["./someModuleForTest"]
}
  1. 모든 테스트 블록 내에서 env의 변수에 액세스 할 수 있습니다.
test("Some test name", () => {
  expect(process.env.APP_PORT).toBe("8080")
})


답변

또 다른 옵션은 정의 jest.config.js뒤에 파일 에 추가하는 것입니다 module.exports.

process.env = Object.assign(process.env, {
  VAR_NAME: 'varValue',
  VAR_NAME_2: 'varValue2'
});

이렇게하면 ENV.spec파일 에서 변수 를 정의 할 필요가 없으며 전역 적으로 조정할 수 있습니다.


답변

코드를 구성하는 방법에 따라 런타임에 실행되는 함수 내에 env 변수를 넣는 또 다른 옵션이 있습니다.

이 파일에서 env var는 가져올 때 설정되며 require다른 env vars를 테스트하기 위해 dynamic s가 필요합니다 ( 이 답변에 설명되어 있음 ).

const env = process.env.MY_ENV_VAR;

const envMessage = () => `MY_ENV_VAR is set to ${env}!`;

export default myModule;

이 파일에서 env var는 envMessage실행시 설정되며 테스트에서 직접 process.env를 변경할 수 있어야합니다.

const envMessage = () => {
  const env = process.env.MY_VAR;
  return `MY_ENV_VAR is set to ${env}!`;
}

export default myModule;

Jest 테스트 :

const vals = [
  'ONE',
  'TWO',
  'THREE',
];

vals.forEach((val) => {
  it(`Returns the correct string for each ${val} value`, () => {
    process.env.MY_VAR = val;

    expect(envMessage()).toEqual(...


답변

Serhan C.의 답변에 대해 조금 확장 ( https://stackoverflow.com/a/57944454/2708174 ) …

이 블로그 https://tekloon.dev/using-dotenv-with-jest 에 따르면 호출하는 외부 스크립트를 만들고 참조 할 필요없이에 "dotenv/config"직접
포함 할 수 있습니다.setupFilesrequire("dotenv").config() .

즉, 간단히

module.exports = {
    setupFiles: ["dotenv/config"]
}