J'ai une application qui dépend de variables environnementales telles que:
const APP_PORT = process.env.APP_PORT || 8080;
et je voudrais tester cela par exemple:
express
est en cours d'exécution sur le port défini avec process.env.APP_PORT
Comment puis-je atteindre cet objectif avec Jest? Puis-je définir ces variables process.env
avant chaque test ou devrais-je me moquer de cette façon?
La façon dont je l’ai fait peut être trouvée dans cette SO question .
Il est important de resetModules avant chaque test, puis d'importer dynamiquement le module à l'intérieur du test:
describe('environmental variables', () => {
const OLD_ENV = process.env;
beforeEach(() => {
jest.resetModules() // this is important
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
});
});
En fonction de la manière dont vous pouvez organiser votre code, une autre option peut consister à placer la variable env dans une fonction exécutée à l'exécution.
Dans ce fichier, la variable env est définie au moment de l'importation et requiert require
s dynamique pour tester différents vars env (comme décrit dans cette réponse ):
const env = process.env.MY_ENV_VAR;
const envMessage = () => `MY_ENV_VAR is set to ${env}!`;
export default myModule;
Dans ce fichier, la variable env est définie sur le temps d'exécution envMessage
et vous devriez être en mesure de muter le fichier process.env directement dans vos tests:
const envMessage = () => {
const env = process.env.MY_VAR;
return `MY_ENV_VAR is set to ${env}!`;
}
export default myModule;
Test de plaisanterie:
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(...