परीक्षण प्रक्रिया। Jest के साथ जेन


114

मेरे पास एक ऐप है जो पर्यावरण चर पर निर्भर करता है जैसे:

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

और मैं उदाहरण के लिए इसका परीक्षण करना चाहूंगा:

  • APP_PORT को नोड एनवी चर द्वारा सेट किया जा सकता है।
  • या कि कोई expressऐप पोर्ट सेट पर चल रहा हैprocess.env.APP_PORT

मैं इसे जेस्ट के साथ कैसे प्राप्त कर सकता हूं? क्या मैं process.envप्रत्येक परीक्षण से पहले इन चर को सेट कर सकता हूं या क्या मुझे किसी तरह इसका मजाक उड़ाना चाहिए?


हाँ, आप पर्यावरण चर
दीप कक्कड़

@Deep AFAIK मैं उन्हें केवल एक बार jest config में सेट कर सकते हैं।
टॉमाज़ मूलार्क 12

जवाबों:


154

जिस तरह से मैंने किया वह इस एसओ प्रश्न में पाया जा सकता है

प्रत्येक परीक्षण से पहले रीसेट करना महत्वपूर्ण है और फिर गतिशील रूप से परीक्षण के अंदर मॉड्यूल आयात करें:

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

यदि आप नीचे दिए गए उत्तर के लिए जेस्ट लुक को चलाने से पहले env मानों को लोड करने का तरीका खोजते हैं । आपको इसके लिए setupFiles का उपयोग करना चाहिए ।


2
कृपया पूर्ण प्रतिक्रिया प्रदान करें
Yves M.

मेरे लिए बहुत अच्छा काम किया। यदि आपको एक डिफ़ॉल्ट निर्यात का उपयोग करने की आवश्यकता है जो आप कर सकते हैं: const testModule = आवश्यकता ('../../ config / vv') डिफ़ॉल्ट।
अजीज

6
यदि यह आपके लिए काम नहीं करता है, तो सुनिश्चित करें कि जब आप अपने वास्तविक कोड में एनवी चर पढ़ रहे हैं, तो आप इसे एक फ़ंक्शन / सीमित दायरे में पढ़ रहे हैं, बजाय इसके कि वैश्विक वेरिएबल की प्रक्रिया की ओर इशारा किया गया हो।
पेंगुइन

1
@ लर्नर अगर मुझे सही delete process.env.NODE_ENV; से याद है तो मेरे कोड से सिर्फ एक बचा हुआ है और आपके मामले में कोई बात नहीं होनी चाहिए। क्या मायने रखता है कि आप jest.resetModules()परीक्षण से पहले कॉल करते हैं और इसके बाद आप प्रारंभिक प्रक्रिया को पुनर्स्थापित करते हैं ।env ऑब्जेक्ट (OLD_ENV)
टॉमाज़ मूलारज़क

1
@ थीम आपको मूल ऑब्जेक्ट को म्यूट न करने के लिए एक प्रति बनाने की आवश्यकता है (जो बाद में आपको पुनर्स्थापित करने की आवश्यकता है)
टॉमस मुलरस्क

60

जेस्ट 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
यह jest में धन्यवाद चर को संभालने का सबसे सीधा तरीका है, धन्यवाद!
क्लेव

24

इन ./package.json:

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

इन ./jest/setEnvVars.js:

process.env.SOME_VAR = 'value';


2
शायद सबसे आसान तरीका मैंने देखा है। Dotenv पैकेज को स्थापित करने की आवश्यकता नहीं है।
मैट

23

आप setupFilesjest config की सुविधा का उपयोग कर सकते हैं । जैसा कि प्रलेखन ने कहा है कि,

मॉड्यूल के लिए पथों की एक सूची जो परीक्षण वातावरण को कॉन्फ़िगर या सेट करने के लिए कुछ कोड चलाते हैं। प्रत्येक setupFile परीक्षण फ़ाइल के अनुसार एक बार चलाया जाएगा। चूंकि प्रत्येक परीक्षण अपने स्वयं के वातावरण में चलता है, इन लिपियों को परीक्षण कोड को निष्पादित करने से तुरंत पहले परीक्षण वातावरण में निष्पादित किया जाएगा।

  1. npm install dotenv dotenv जो env वेरिएबल को एक्सेस करने के लिए उपयोग करता है।
  2. अपनी .envफ़ाइल को अपने एप्लिकेशन की रूट डायरेक्टरी में बनाएँ और इस लाइन को इसमें जोड़ें।
#.env
APP_PORT=8080
  1. अपनी कस्टम मॉड्यूल फ़ाइल बनाएं क्योंकि यह नाम someModuleForTest.js है और इस लाइन को इसमें जोड़ें।
//someModuleForTest.js
require("dotenv").config()
  1. अपनी jest.config.jsफ़ाइल को इस तरह अपडेट करें
module.exports = {
  setupFiles: ["./someModuleForTest"]
}
  1. आप सभी परीक्षण ब्लॉकों के भीतर एनवी के चर का उपयोग कर सकते हैं।
test("Some test name", () => {
  expect(process.env.APP_PORT).toBe("8080")
})

10

एक अन्य विकल्प यह है कि इसे परिभाषा के jest.config.jsबाद फाइल में जोड़ा जाए module.exports:

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

इस तरह ENVसे प्रत्येक .specफ़ाइल में चर को परिभाषित करना आवश्यक नहीं है और उन्हें विश्व स्तर पर समायोजित किया जा सकता है।


यह एक शानदार जवाब है। धन्यवाद।
spierce7

3

इस बात पर निर्भर करता है कि आप अपने कोड को कैसे व्यवस्थित कर सकते हैं, एक और विकल्प एनव चर को रनटाइम में निष्पादित होने वाले फ़ंक्शन के भीतर रखा जा सकता है।

इस फ़ाइल में, env var को आयात समय पर सेट किया गया है, और requireअलग-अलग env var का परीक्षण करने के लिए डायनामिक 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;

जेस्ट परीक्षण:

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(...

1

सेरन सी। के उत्तर ( https://stackoverflow.com/a/57944454/2708174 ...) पर थोड़ा विस्तार करें ...

इस ब्लॉग के अनुसार https://tekloon.dev/use-dotenv-with-jest आप एक बाहरी स्क्रिप्ट को कॉल करने और बनाने के संदर्भ "dotenv/config"में शामिल setupFilesकिए बिना सीधे शामिल कर सकते हैं require("dotenv").config()

यानी, बस करो

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

0

मुझे लगता है कि आप भी यह कोशिश कर सकते हैं:

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

// test code...

process.env = currentEnv;

यह मेरे लिए काम करता है और आपको मॉड्यूल चीजों की आवश्यकता नहीं है


समस्या यह है कि यदि आप प्रक्रिया का उपयोग करने वाली किसी अन्य फ़ाइल को आयात करते हैं। तो इसे सीधे बदलने से कोई प्रभाव नहीं पड़ेगा। इसलिए प्रत्येक परीक्षण से पहले, आपको जेस्ट को कुछ बताने की आवश्यकता है जैसे - "हे आयात और इस फाइल को फिर से निष्पादित करें"।
टॉमाज़ मूलार्क

0

मेरी राय में, यह बहुत क्लीनर और समझने में आसान है यदि आप पर्यावरण चर की पुनर्प्राप्ति को एक उपयोग में निकालते हैं (आप शायद तेजी से विफल होने के लिए एक चेक को शामिल करना चाहते हैं यदि पर्यावरण चर वैसे भी सेट नहीं है), तो आप बस उपयोग का मजाक उड़ा सकते हैं। ।

// 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', () => {...});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.