假设我有方法修饰器,例如。

class Service {
    @LogCall()
    doSomething() {
        return 1 + 1;
    }
}

是否可以在单元测试中模拟decorator,这样就不会应用或应用模拟逻辑?
我正在为任何类型脚本装饰器寻找通用解决方案,因为可以更新装饰器以检查@LogCall标志或在测试期间关闭它,但这不是可重用的解决方案。
当然,我们的用例比示例中提供的要复杂得多——我们有window.disableLogDecorator应用于@memoizeSelector选择器,因此只有在特定的状态部分更新时才会调用它们。由于我们在测试中模拟状态的方式,ngrx/store会破坏我们的测试,所以理想情况下我们希望禁用它。

最佳答案

我怀疑有人嘲笑装修工人。您可以添加静态开关并在decorator内部处理它,或者创建可配置的decorator工厂(但仍然是静态的):

 @LogCall(LogCallFactory)

 export function LogCall(factory:Function):Function
 {
    return function(target:Object, propertyKey:string, descriptor:TypedPropertyDescriptor<any>)
    {
       return factory(target, propertyKey, descriptor);
    }
 }

decorators是在编译时编写的,因此可能可以使用条件编译。

10-08 00:57