gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:18:43 26 4
gpt4 key购买 nike

我正在使用 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 条件,其中 isDevtrue。我试图在测试请求之前重新分配 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 变量?

最佳答案

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

关于javascript - 如何在 Jest 测试函数中模拟变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61009462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com