Jest로 process.env 테스트


123

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

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

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

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

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


예 당신은 환경 변수를 설정할 수 있습니다
깊은 Kakkar

@Deep AFAIK jest 구성에서 한 번만 설정할 수 있습니다.
Tomasz Mularczyk

답변:


164

내가 한 방식 은이 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 를 사용해야 합니다.


2
전체 응답을 제공해주세요
Yves M.

나를 위해 훌륭하게 일했습니다. 기본 내보내기를 사용해야하는 경우 다음을 수행 할 수 있습니다. const testingModule = require ( '../../ config / env'). default;
Aziz

8
이것이 작동하지 않는 경우 실제 코드에서 env 변수를 읽을 때 전역 변수가 process.env.YOUR_VARIABLE을 가리키는 대신 함수 / 제한된 범위에서 읽고 있는지 확인하십시오.
penguinsource

1
내가 올바르게 기억한다면 @learner delete process.env.NODE_ENV; 는 내 코드에서 남은 것이므로 귀하의 경우에는 중요하지 않습니다. 중요한 것은 당신이 전화 것입니다 jest.resetModules()테스트 이전과 후 초기 process.env 개체 (OLD_ENV)를 복원
토마스 Mularczyk

1
원래 개체 변이하지 않기 위해 복사본을 만들 필요가 @MEMark는 (이 나중에 복원 할 필요)
토마스 Mularczyk

70

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'

그게 다야.


1
이것은 농담에서 환경 변수를 처리하는 가장 간단한 방법입니다. 감사합니다!
klaevv

29

에서 ./package.json:

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

에서 ./jest/setEnvVars.js:

process.env.SOME_VAR = 'value';


2
아마도 내가 본 가장 쉬운 방법 일 것입니다. dotenv 패키지를 설치할 필요가 없습니다.
MattC

이것은 Create-React-App github.com/facebook/create-react-app/issues/5325 에서는 작동하지 않습니다 . 테스트에 사용할 env 변수는 .env.test.local 파일에 추가해야합니다.
Pere

23

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")
})

12

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

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

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


이것은 환상적인 대답입니다. 감사합니다.
spierce7 2010 년

3

코드를 구성하는 방법에 따라 런타임에 실행되는 함수 내에 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(...


0

나는 당신도 이것을 시도 할 수 있다고 생각합니다.

const currentEnv = process.env;
process.env = { ENV_NODE: 'whatever' };

// test code...

process.env = currentEnv;

이것은 나를 위해 작동하며 모듈 물건이 필요하지 않습니다.


문제는 process.env를 사용하는 다른 파일을 가져 오면 직접 변경해도 효과가 없다는 것입니다. 따라서 각 테스트 전에 Jest에게 "이 파일을 다시 가져 와서 실행하십시오"와 같이 말해야합니다.
Tomasz Mularczyk

0

제 생각에는 환경 변수 검색을 util로 추출하면 훨씬 깨끗하고 이해하기 쉽습니다 (환경 변수가 설정되지 않은 경우 빠르게 실패하는 검사를 포함하고 싶을 것입니다), util을 모의 할 수 있습니다 .

// util.js
exports.getEnv = (key) => {
    const value = process.env[key];
    if (value === undefined) {
      throw new Error(`Missing required environment variable ${key}`);
    }
    return value;
};

// app.test.js
const util = require('./util');
jest.mock('./util');

util.getEnv.mockImplementation(key => `fake-${key}`);

test('test', () => {...});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.