জেস্টের সাথে পরীক্ষা প্রক্রিয়া.এনভি


115

আমার কাছে এমন একটি অ্যাপ রয়েছে যা পরিবেশগত পরিবর্তনশীলগুলির উপর নির্ভর করে:

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

এবং আমি এটি পরীক্ষা করতে চাই উদাহরণস্বরূপ:

  • নোড এনভির ভেরিয়েবলের মাধ্যমে APP_PORT সেট করা যেতে পারে।
  • বা যে কোনও expressঅ্যাপ্লিকেশনটি বন্দর সেট দিয়ে চলছেprocess.env.APP_PORT

আমি কীভাবে জেস্টের সাথে এটি অর্জন করতে পারি? আমি কি process.envপ্রতিটি পরীক্ষার আগে এই ভেরিয়েবলগুলি সেট করতে পারি বা আমার এটি কোনওভাবে উপহাস করা উচিত?


হ্যাঁ আপনি পরিবেশ পরিবর্তনশীল সেট করতে পারেন
ডিপ কাক্কর

@ ডিপ এএফাইক আমি এগুলি কেবল একবারে ঠাট্টা কনফিগারেশনে সেট করতে পারি।
টমাসজ মুলারসিজিক

উত্তর:


156

আমি যেভাবে এটি করেছি তা এই এসও প্রশ্নে পাওয়া যাবে

প্রতিটি পরীক্ষার আগে মডিউলগুলি পুনরায় সেট করা এবং তারপরে পরীক্ষার অভ্যন্তরে মডিউলটি গতিশীলভাবে আমদানি করা গুরুত্বপূর্ণ :

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

নীচের উত্তরটির জন্য জেস্ট চেহারাটি চালানোর আগে আপনি এনভিভ মানগুলি লোড করার কোনও উপায় অনুসন্ধান করেন । তার জন্য আপনার সেটআপফাইল ব্যবহার করা উচিত ।


4
দয়া করে পূর্ণ প্রতিক্রিয়া সরবরাহ করুন
ইয়ভেস এম

আমার জন্য দুর্দান্ত কাজ করেছেন যদি আপনার কোনও ডিফল্ট রফতানি ব্যবহার করতে হয় তবে আপনি এটি করতে পারেন: const পরীক্ষা করা মডুল = প্রয়োজন ('../../ কনফিগার / এনভি') default
আজিজ

6
যদি এটি আপনার পক্ষে কাজ করে না, আপনি যখন আপনার আসল কোডটিতে env ভেরিয়েবলটি পড়ছেন তা নিশ্চিত করুন, আপনি বিশ্বব্যাপী ভেরিয়েবলগুলি প্রক্রিয়া.এনভিতে নির্দেশিত করার পরিবর্তে এটি একটি ফাংশন / সীমাবদ্ধ স্কোপে পড়ছেন Y
পেঙ্গুইনসোর্স

4
@ অ্যালিয়েনার যদি আমি সঠিকভাবে মনে করি তবে তা delete process.env.NODE_ENV; আমার কোড থেকে একটি বাকী এবং আপনার ক্ষেত্রে এটি বিবেচনা করা উচিত নয়। কী বিষয়টি আপনি jest.resetModules()টেস্টের আগে কল করেন এবং তার পরে আপনি প্রাথমিক প্রক্রিয়া পুনরুদ্ধার করেন en এনভি অবজেক্ট (ওলডি_ইএনভি)
টমাসজ মুলারসিজিক

4
@ মেমার্কে আপনাকে আসল বস্তুটি পরিবর্তিত করতে না করার জন্য একটি অনুলিপি তৈরি করতে হবে (যা পরে আপনাকে পুনরুদ্ধার করতে হবে)
টমাসজ মুলারজারিক

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'

এটাই.


4
উপহাসের মধ্যে এনভির ভেরিয়েবলগুলি হ্যান্ডেল করার এটি সবচেয়ে সহজ উপায়, ধন্যবাদ!
klaevv

26

ইন ./package.json:

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

ইন ./jest/setEnvVars.js:

process.env.SOME_VAR = 'value';


4
সম্ভবত সবচেয়ে সহজ উপায় আমি দেখেছি। ডটেনভ প্যাকেজ ইনস্টল করার দরকার নেই।
ম্যাটসি

23

আপনি setupFilesঠাট্টা কনফিগারেশনের বৈশিষ্ট্যটি ব্যবহার করতে পারেন । নথি হিসাবে বলা হয়েছে যে,

মডিউলগুলির পাথগুলির একটি তালিকা যা পরীক্ষার পরিবেশ কনফিগার করতে বা সেট আপ করতে কিছু কোড চালায়। প্রতিটি সেটআপফাইলে পরীক্ষার ফাইলের জন্য একবার চালানো হবে। যেহেতু প্রতিটি পরীক্ষা তার নিজস্ব পরিবেশে চলে, তাই এই স্ক্রিপ্টগুলি পরীক্ষার পরিবেশে পরীক্ষার কোড নিজেই কার্যকর করার আগেই কার্যকর করা হবে।

  1. npm install dotenv ডটেনভ যা এনভ ভেরিয়েবল অ্যাক্সেস করতে ব্যবহার করে।
  2. .envআপনার অ্যাপ্লিকেশনটির ডিরেক্টরি ডিরেক্টরিতে আপনার ফাইল তৈরি করুন এবং এতে এই লাইনটি যুক্ত করুন।
#.env
APP_PORT=8080
  1. আপনার কাস্টম মডিউল ফাইলটি এটির কিছু নাম হিসাবে তৈরি করুন ModuleForTest.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

আপনি কীভাবে আপনার কোডটি সংগঠিত করতে পারবেন তার উপর নির্ভর করে রান্টটাইমে এক্সিকিউটিভ করা কোনও ফাংশনের মধ্যে এনভির ভেরিয়েবল স্থাপন করা অন্য বিকল্প হতে পারে।

এই ফাইলে, এনভ ভার্জটি আমদানির সময় সেট করা থাকে এবং requireবিভিন্ন এনভ ভার্স পরীক্ষা করার জন্য গতিশীল গুলি প্রয়োজন (যা এই উত্তরে বর্ণিত হয়েছে ):

const env = process.env.MY_ENV_VAR;

const envMessage = () => `MY_ENV_VAR is set to ${env}!`;

export default myModule;

এই ফাইলে, এনভ ভার্জ envMessageকার্যকর হওয়ার সময় সেট করা থাকে এবং আপনার প্রক্রিয়াগুলিতে সরাসরি প্রক্রিয়া.এনভকে পরিবর্তন করতে সক্ষম হওয়া উচিত:

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/using-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;

এটি আমার পক্ষে কাজ করে এবং আপনার কাছে মডিউল জিনিসগুলির প্রয়োজন নেই


সমস্যাটি হ'ল আপনি যদি এমন অন্য কোনও ফাইল আমদানি করেন যা প্রসেস.এনভ ব্যবহার করে তবে সরাসরি এটি পরিবর্তন করা কোনও প্রভাব ফেলবে না। সুতরাং প্রতিটি পরীক্ষার আগে আপনাকে জেস্টকে এমন কিছু বলতে হবে - "আরে এই ফাইলটি আবার আমদানি করুন এবং চালনা করুন"।
টমাসজ মুলারসিজেক ​​10'19

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', () => {...});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.