如何在Jest测试函数中模拟变量?

时间:2020-04-03 10:08:12

标签: javascript node.js unit-testing express jestjs

我正在用Jest测试Express应用程序,遇到一个小问题-模块使用在测试执行之前初始化的变量,这是我的 app.js 文件:

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是{{1 }}。 我已经尝试在测试请求之前重新分配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); }); }); 变量?

2 个答案:

答案 0 :(得分:2)

您可以使用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())....
    });
  });
});

答案 1 :(得分:0)

您可以创建一个.env文件仅用于测试。 如果您使用的是express,也可以使用dotenv。 使用此软件包,您可以从其他文件导入环境变量。

只需在文件顶部添加这一行。

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

这样,您始终可以在每次测试之前更改要使用的env变量。