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

时间:2017-07-14 09:59:31

标签: angular unit-testing typescript mocking decorator

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

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

是否可以在单元测试中模拟@LogCall装饰器,因此不会应用或应用模拟逻辑?

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

我们的用例当然比提供的示例复杂得多 - 我们将@memoizeSelector应用于ngrx/store选择器,因此只有在特定的状态部分是更新。由于我们在测试中模拟状态,@memoizeSelector打破了我们的测试,所以理想情况下我们要禁用它。

1 个答案:

答案 0 :(得分:-2)

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

 @LogCall(LogCallFactory)

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

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