[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';
답변
setupFiles
jest 구성의 기능을 사용할 수 있습니다 . 로 문서를했다 , 그
테스트 환경을 구성하거나 설정하기 위해 일부 코드를 실행하는 모듈에 대한 경로 목록입니다. 각 setupFile은 테스트 파일 당 한 번씩 실행됩니다. 모든 테스트는 자체 환경에서 실행되기 때문에 이러한 스크립트는 테스트 코드 자체를 실행하기 직전에 테스트 환경에서 실행됩니다.
npm install dotenv
env 변수에 액세스하는 데 사용하는 dotenv.- 당신의 작성
.env
응용 프로그램의 루트 디렉토리에 파일을하고 그것으로이 줄을 추가합니다.
#.env
APP_PORT=8080
- 이름이 someModuleForTest.js 인 사용자 지정 모듈 파일을 만들고이 줄을 추가합니다.
//someModuleForTest.js
require("dotenv").config()
- 다음
jest.config.js
과 같이 파일을 업데이트하십시오.
module.exports = {
setupFiles: ["./someModuleForTest"]
}
- 모든 테스트 블록 내에서 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"
직접
포함 할 수 있습니다.setupFiles
require("dotenv").config()
.
즉, 간단히
module.exports = {
setupFiles: ["dotenv/config"]
}