我正在使用时刻,需要将当前时间固定为总是返回1/1/18。因此,当我致电moment()
或moment.now()
时,我应该收到时间对象,时间设置为1/1/18。
现在我可以覆盖moment.now但是其他任何使用时刻的东西都会因为模块缓存而产生这个存根,这不是我想要的。
所以我写了一个momentWrapper来复制时刻的原型并定义一个新的构造函数。问题是在调用moment()
时它没有为now
使用新定义的原型,因为我只是简单地调用了时刻的构造函数。我需要复制片刻并在我的新构建器中更改它的now
原型我不知道该怎么做。
这是我到目前为止所做的:
/**
* Wraps moment so that alternate time can be set as the 'now' time.
* This idea was grabbed from fs-extra https://github.com/jprichardson/node-fs-extra
* @module lib/momentWrapper
*/
var moment = require('moment');
function momentWrapper() {
return moment.apply(this, arguments);
}
assign(momentWrapper, moment);
momentWrapper.prototype = Object.create(moment.prototype);
momentWrapper.prototype.now = newNow;
momentWrapper.prototype.constructor = momentWrapper;
function newNow() {
return +new Date('1995-12-17T03:24:00');
}
/**
* Loops through given arguments and assigns them to a object
* Credit: fs-extra https://github.com/jprichardson/node-fs-extra/blob/fab376ec2bd4d4420806644c1b37a7ac487d17ec/lib/util/assign.js
* @function assign
* @return {Object} Mutated object with copied keys
*/
function assign () {
const args = [].slice.call(arguments).filter(i => i);
const dest = args.shift();
args.forEach(src => {
Object.keys(src).forEach(key => {
if (key === 'now') {
dest[key] = newNow;
}
else {
dest[key] = src[key];
}
});
});
return dest;
}
module.exports = momentWrapper;
测试文件:
var momentWrapper = require('./momentWrapper');
var moment = require('moment');
console.log(momentWrapper()); // Not working
console.log(momentWrapper('12/25/18', 'MM/DD/YY')); // Working
console.log(momentWrapper(momentWrapper.now()).format()) // Working
console.log('----------------------------------------');
console.log(moment()); // Working not being overridden
console.log(moment(moment.now()).format()) // // Working not being overridden
输出:
moment("2018-01-27T15:56:50.928")
moment("2018-12-25T00:00:00.000")
1995-12-17T03:24:00-05:00
----------------------------------------
moment("2018-01-27T15:56:50.938")
2018-01-27T15:56:50-05:00
答案 0 :(得分:1)
取决于您的使用案例,而不是使用包装器;您可以暂时将now
功能替换为自定义存根,当您使用它时,只需将原来的功能放回去。
var moment = require("moment");
// prepare before testing
moment.originalNow = moment.now;
moment.now = () => +new Date('1995-12-17T03:24:00');
console.log([
moment().format(),
moment(moment.now()).format(),
moment('12/25/18', 'MM/DD/YY').format()
]);
// clean after testing
moment.now = moment.originalNow;
moment.originalNow = undefined;
console.log([
moment().format(),
moment(moment.now()).format()
]);
答案 1 :(得分:0)
它非常明显,我没有看到它。你甚至不需要使用继承,只需克隆时刻对象并重写now属性:
const orig = require("moment");
const moment = (...args) => args.length === 0 ? moment.now() : orig(...args);
Object.assign(moment, orig);
moment.now = () => orig('1995-12-17T03:24:00');
export moment;