我正在用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);
});
});
变量?
答案 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变量。