Как смоделировать переменную внутри тестовой функции Jest? - PullRequest
2 голосов
/ 03 апреля 2020

Я тестирую приложение Express с Jest и столкнулся с небольшой проблемой - модуль использует переменную, которая инициализируется перед выполнением теста, вот мое приложение . js file:

const app = express();
const isDev = process.env.NODE_ENV === 'development';

app.get('*', (req, res, next) => {
  if (isDev) {
    res.status(404).json({ error: 'Wrong URL' });
  } else {
    res.sendFile(path.join(__dirname, '../index.html'));
  }
});

app.use(errorHandler);

module.exports = app;

Когда я запускаю Jest тесты, мой process.env.NODE_ENV равен test, поэтому я не могу покрыть первое if условие, где isDev равно true. Я пытался переназначить process.env.NODE_ENV перед тестовым запросом - он работает, но поскольку isDev инициализация переменной была выполнена до выполнения теста, она не сработала.

Это мой тест:

const request = require('supertest');
const app = require('../app');

describe('GET /*', () => {
  const OLD_ENV = process.env;

  beforeEach(() => {
    // Clear JEST cache
    jest.resetModules();
    process.env = { ...OLD_ENV };
    Reflect.deleteProperty(process.env, 'NODE_ENV');
  });

  test('Not existing path (development env) - 404 status', async () => {
    process.env.NODE_ENV = 'development';

    const response = await request(app).
      get('/wrongUrl');
    expect(response.status).toBe(404);

  });

});

Как мне сменить переменную isDev внутри моего теста?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

вы можете использовать jest.isolateModules (fn) для приложения в изоляции, как это:

describe("GET /*", () => {
  describe("on development", () => {
    let app;
    beforeAll(() => {
      process.env.NODE_ENV = "development";
      jest.isolateModules(() => {
        app = require("../app");
      });
    });

    it("should to this", () => {
      expect(app).....
    });
  });

  describe("on production", () => {
    let app;
    beforeAll(() => {
      process.env.NODE_ENV = "production";
      jest.isolateModules(() => {
        app = require("../app");
      });
    });

    it("should to that", () => {
      expect(app())....
    });
  });
});
0 голосов
/ 03 апреля 2020

Вы можете создать файл .env только для тестирования. Если вы используете express, вы также можете использовать dotenv. С помощью этого пакета вы можете импортировать переменные env из разных файлов.

Просто добавьте эту строку вверху вашего файла.

require('dotenv').config({ path: process.cwd() + '/path/to/test.env' });

Таким образом, вы всегда можете изменить переменные env, которые хотите используйте перед каждым испытанием.

...