Javascript 如何在Jest测试函数中模拟变量?
我正在用Jest测试Express应用程序,遇到了一个小问题-模块使用了在测试执行之前初始化的变量,下面是我的app.js文件: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' }); }
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' });
通过这种方式,您可以在每次测试之前始终更改要使用的环境变量。如果您希望在有环境变量和无环境变量的情况下覆盖这两个分支,该怎么办?