我想在使用Date类时进行一些需要更改进程日期的测试:
console.log(Date.now())
正常运行我的程序,该过程将获得机器当前时间:
"scripts": {
"start": "node testDate.js"
}
是否有类似交叉环境的东西可以改变初始流程日期?
"scripts": {
"start": "cross-env CURRENT_DATE=<future-date> node testDate.js"
}
或者在运行时是否有解决方案?
NodeJS可以更改过程日期吗?
process.DATE_CLOCK=Date("<future-date>")
console.log(Date.now())// will print the future date + time passed after previous line has been executed
答案 0 :(得分:1)
我认为这是不可能通过现有的节点环境变量实现的,但您应该 签出 mockdate 包。
这是一个在单元测试中使用的例子。
// mut.js
module.exports = {
getCurrentDate: () => Date.now()
}
// mut.test.js
const mut = require('./mut');
const mockdate = require('mockdate');
describe('mut', () => {
const mockedTime = 1609865118363;
it('should return adjusted date', () => {
mockdate.set(mockedTime);
expect(mut.getCurrentDate())
.toEqual(mockedTime);
});
it('should return current date/time', () => {
mockdate.reset();
expect(mut.getCurrentDate())
.not.toEqual(mockedTime);
});
});
如果您坚持通过节点环境添加它,您可以添加一个类似于 Sengupta Amit 注释的进程环境检查并包装您的应用程序入口点。这会将时间设置为类似于您在上面要求的方式。
//testDate.js
// CURRENT_DATE=1609865118363 node ./testDate.js
const mockdate = require('mockdate');
const mut = require('./mut');
const currentDate = process.env.CURRENT_DATE;
if (currentDate) mockdate.set(parseInt(currentDate));
console.log(mut.getCurrentDate()); // will log 1609865118363 to console
编辑: 还使用 Express 和 Node Http Server 对此进行了测试。它仍然有效,并将返回带有通过 mockdate 设置的时间的 Date 标头。
// CURRENT_DATE=1609865118363 node testDate.js
const app = require('express')();
const mockdate = require('mockdate');
const currentDate = process.env.CURRENT_DATE;
if (currentDate) mockdate.set(parseInt(currentDate));
app.get('/', (req, res) => res.send());
app.listen(3000, (err) => {
if(err) console.log(err);
})
const mockdate = require('mockdate');
const currentDate = process.env.CURRENT_DATE;
if (currentDate) mockdate.set(parseInt(currentDate));
const http = require('http');
http.createServer(function (req, res) {
res.writeHead(200);
res.end();
}).listen(8080);