Jest ile test process.env


117

Aşağıdaki gibi çevresel değişkenlere bağlı olan bir uygulamam var:

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

ve örneğin bunu test etmek istiyorum:

  • APP_PORT, düğüm env değişkeni tarafından ayarlanabilir.
  • veya bir expressuygulama ile ayarlanmış bağlantı noktası üzerinde çalışıyorprocess.env.APP_PORT

Bunu Jest ile nasıl başarabilirim? Bu process.envdeğişkenleri her testten önce ayarlayabilir miyim yoksa bir şekilde alay etmeli miyim?


evet, ortam değişkenini ayarlayabilirsiniz
Deep Kakkar

@Deep AFAIK Bunları jest yapılandırmasında yalnızca bir kez ayarlayabilirim.
Tomasz Mularczyk

Yanıtlar:


157

Bunu yapma şeklim bu SO sorusunda bulunabilir .

Modülleri her testten önce sıfırlamak ve ardından modülü dinamik olarak testin içine aktarmak önemlidir :

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'i çalıştırmadan önce env değerlerini yüklemenin bir yolunu arıyorsanız, aşağıdaki yanıtı arayın . Bunun için setupFiles kullanmalısınız .


2
Lütfen tam yanıtı sağlayın
Yves M.

Benim için harika çalıştı. Varsayılan bir dışa aktarım kullanmanız gerekiyorsa şunları yapabilirsiniz: const testingModule = require ('../../ config / env'). Default;
Aziz

6
bu sizin için işe yaramazsa, gerçek kodunuzdaki env değişkenini okurken, process.env.YOUR_VARIABLE'a işaret eden global değişkenler yerine onu bir işlev / sınırlı kapsamda okuduğunuzdan emin olun.
penguinsource

1
@learner eğer doğru hatırlıyorsam kodumdan delete process.env.NODE_ENV; sadece bir kalıntıdır ve sizin durumunuzda önemli olmamalıdır. Önemli jest.resetModules()olan testten önce çağırmanız ve testten sonra ilk process.env nesnesini geri yüklemenizdir (OLD_ENV)
Tomasz Mularczyk

1
@MEMark Orijinal nesneyi değiştirmemek için bir kopya oluşturmanız gerekir (daha sonra geri yüklemeniz gerekir)
Tomasz Mularczyk

60

Jest setupFiles, bunu halletmenin uygun yoludur ve çalışmasını sağlamak için dotenvbir .envdosya yüklemenize veya hiç kullanmanıza gerek yoktur .

jest.config.js:

module.exports = {
  setupFiles: ["<rootDir>/.jest/setEnvVars.js"]
};

.jest/setEnvVars.js:

process.env.MY_CUSTOM_TEST_ENV_VAR = 'foo'

Bu kadar.


1
Bu, env değişkenlerini şakayla ele almanın en kolay yoludur, teşekkürler!
klaevv

26

İçinde ./package.json:

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

İçinde ./jest/setEnvVars.js:

process.env.SOME_VAR = 'value';


2
Muhtemelen gördüğüm en kolay yol. Dotenv paketini kurmanıza gerek yok.
MattC

23

setupFilesJest config özelliğini kullanabilirsiniz . Gibi belgelerin söyledi , o

Test ortamını yapılandırmak veya kurmak için bazı kod çalıştıran modüllerin yollarının listesi. Her kurulum dosyası, test dosyası başına bir kez çalıştırılacaktır. Her test kendi ortamında çalıştığından, bu komut dosyaları, test kodunun kendisi çalıştırılmadan hemen önce test ortamında çalıştırılacaktır.

  1. npm install dotenv env değişkenine erişmek için kullanan dotenv.
  2. Sizin oluşturun .envsenin uygulamanın kök dizinine dosya ve içine bu satırı ekleyin.
#.env
APP_PORT=8080
  1. Özel modül dosyanızı, adı someModuleForTest.js olarak oluşturun ve bu satırı içine ekleyin.
//someModuleForTest.js
require("dotenv").config()
  1. jest.config.jsDosyanızı bu şekilde güncelleyin
module.exports = {
  setupFiles: ["./someModuleForTest"]
}
  1. Env değişkenine tüm test bloklarında erişebilirsiniz.
test("Some test name", () => {
  expect(process.env.APP_PORT).toBe("8080")
})

10

Diğer bir seçenek jest.config.jsde module.exportstanımdan sonra dosyayı dosyaya eklemektir :

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

Bu şekilde ENV, her .specdosyadaki değişkenleri tanımlamak gerekli değildir ve bunlar genel olarak ayarlanabilir.


Bu harika bir cevap. Teşekkür ederim.
spierce7

3

Kodunuzu nasıl düzenleyeceğinize bağlı olarak, başka bir seçenek de env değişkenini çalışma zamanında çalıştırılan bir işlevin içine koymak olabilir.

Bu dosyada, env değişkeni içe aktarma zamanında ayarlanır ve requirefarklı ortam değişkenlerini test etmek için dinamik s gerektirir ( bu yanıtta açıklandığı gibi ):

const env = process.env.MY_ENV_VAR;

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

export default myModule;

Bu dosyada env var, envMessageyürütme zamanında ayarlanır ve process.env'yi doğrudan testlerinizde değiştirebilmeniz gerekir:

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

export default myModule;

Jest testi:

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


0

Bence bunu da deneyebilirsin:

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

// test code...

process.env = currentEnv;

Bu benim için çalışıyor ve modül şeylerine ihtiyacınız yok


sorun şu ki, process.env kullanan başka bir dosyayı içe aktarırsanız, doğrudan değiştirmenin herhangi bir etkisi olmayacaktır. Bu yüzden her testten önce Jest'e "hey bu dosyayı tekrar içe aktarın ve çalıştırın" gibi bir şey söylemeniz gerekir.
Tomasz Mularczyk

0

Benim düşünceme göre, çevre değişkenlerinin alınmasını bir faydaya çıkarırsanız (bir ortam değişkeni zaten ayarlanmadıysa muhtemelen hızlı bir şekilde başarısız olmak için bir kontrol eklemek istersiniz), o zaman kullanımla dalga geçebilirsiniz. .

// 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', () => {...});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.