在定义装饰类时,类装饰器只执行一次。若装饰类包含在测试包中,则将调用装饰函数。
如果decorator函数产生副作用或涉及其他单元(这可能会影响单元测试),则应该对其进行重构。
在这种情况下,装饰器修补类原型方法:
const lifecycleLogger = LoggerFactory.getLogger(NAME);
LIFECYCLE_HOOKS.forEach(hook => {
const original = constructor.prototype[hook];
constructor.prototype[hook] = function(...args) {
lifecycleLogger.info(`${hook}`, ...args);
original.apply(this, args);
};
});
lifecycleLogger
LIFECYCLE_HOOKS.forEach(hook => {
const original = constructor.prototype[hook];
constructor.prototype[hook] = function(...args) {
const lifecycleLogger = LoggerFactory.getLogger(NAME);
lifecycleLogger.info(`${hook}`, ...args);
original.apply(this, args);
};
});