是否可以模拟打字稿装饰器?

Pav*_*cki 5 unit-testing mocking decorator typescript angular

鉴于我有方法装饰器,例如

class Service {
    @LogCall()
    doSomething() {
        return 1 + 1;
    }    
}
Run Code Online (Sandbox Code Playgroud)

是否可以@LogCall在单元测试中模拟装饰器,这样它就不会被应用或应用模拟逻辑?

我正在寻找任何打字稿装饰器的通用解决方案,因为可以更新装饰器以检查window.disableLogDecorator标志或在测试期间将其关闭,但这不是可重用的解决方案。


当然,我们的用例比提供的示例要复杂得多 - 我们将@memoizeSelector其应用于ngrx/store选择器,因此仅在更新特定状态部分时才调用它们。由于我们在测试中模拟状态的方式,@memoizeSelector会破坏我们的测试,因此理想情况下我们希望禁用它。

kem*_*sky -2

我怀疑装饰器是否有任何模拟。您可以添加静态开关并在装饰器内部处理它或创建可配置的装饰器工厂(但仍然是静态的):

 @LogCall(LogCallFactory)

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

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