次のような環境変数に依存するアプリがあります。
const APP_PORT = process.env.APP_PORT || 8080;
そして、例えばそれをテストしたいと思います:
express
アプリがprocess.env.APP_PORT
で設定されたポートで実行されていることJestでこれを達成するにはどうすればよいですか?各テストの前にこれらのprocess.env
変数を設定できますか、それとも何らかの方法でモックする必要がありますか?
私がやった方法 このSO質問にあります 。
各テストの前に resetModules し、テスト内でモジュールを動的にインポートすることが重要です。
describe('environmental variables', () => {
const OLD_ENV = process.env;
beforeEach(() => {
jest.resetModules() // this is important - it clears the cache
process.env = { ...OLD_ENV };
delete process.env.NODE_ENV;
});
afterEach(() => {
process.env = 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
});
});
コードの編成方法に応じて、実行時に実行される関数内にenv変数を配置することもできます。
このファイルでは、インポート時にenv変数が設定され、異なるenv変数をテストするために動的なrequire
sが必要です( this answer で説明)。
const env = process.env.MY_ENV_VAR;
const envMessage = () => `MY_ENV_VAR is set to ${env}!`;
export default myModule;
このファイルでは、env変数は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(...
あなたもこれを試すことができると思います:
const currentEnv = process.env;
process.env = { ENV_NODE: 'whatever' };
// test code...
process.env = currentEnv;
これは私のために機能し、モジュールのものは必要ありません