Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Jest测试函数中模拟变量?_Javascript_Node.js_Unit Testing_Express_Jestjs - Fatal编程技术网

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

Javascript 如何在Jest测试函数中模拟变量?,javascript,node.js,unit-testing,express,jestjs,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' }); }

我正在用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
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
变量?

您可以像这样单独使用应用程序:

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

您可以创建一个
.env
文件来进行测试。 如果您使用的是
express
,也可以使用
dotenv
。 使用此软件包,您可以从不同的文件导入环境变量

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

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

通过这种方式,您可以在每次测试之前始终更改要使用的环境变量。

如果您希望在有环境变量和无环境变量的情况下覆盖这两个分支,该怎么办?