最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

如何使用包装器模块覆盖时刻

IT培训 admin 4浏览 0评论

如何使用包装器模块覆盖时刻

我正在使用时刻,需要将当前时间固定为总是返回1/1/18。因此,当我调用moment()moment.now()时,我应该收到一个时间对象,时间设置为1/1/18。

现在我可以覆盖moment.now但是其他任何使用时刻的东西都会因为模块缓存而产生这个存根,这不是我想要的。

所以我写了一个momentWrapper来复制时刻的原型并定义一个新的构造函数。问题是当调用moment()时它没有使用now的新定义原型,因为我只是调用moment的构造函数。我需要复制片刻并在我的新构造函数中更改它的now protoype我不知道该怎么做。

这是我到目前为止:

/**
 * Wraps moment so that alternate time can be set as the 'now' time.
 * This idea was grabbed from 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 .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
回答如下:

根据您的使用情况,而不是使用包装;你可以暂时用自定义存根替换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/1/18。因此,当我调用moment()moment.now()时,我应该收到一个时间对象,时间设置为1/1/18。

现在我可以覆盖moment.now但是其他任何使用时刻的东西都会因为模块缓存而产生这个存根,这不是我想要的。

所以我写了一个momentWrapper来复制时刻的原型并定义一个新的构造函数。问题是当调用moment()时它没有使用now的新定义原型,因为我只是调用moment的构造函数。我需要复制片刻并在我的新构造函数中更改它的now protoype我不知道该怎么做。

这是我到目前为止:

/**
 * Wraps moment so that alternate time can be set as the 'now' time.
 * This idea was grabbed from 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 .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
回答如下:

根据您的使用情况,而不是使用包装;你可以暂时用自定义存根替换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()
]);

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论