2017-07-14 32 views
1

鉴于我有方法装饰器,例如是否有可能模拟打字稿装饰?

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

是否有可能嘲笑在单元测试@LogCall装饰,所以它不会被应用或与嘲笑逻辑应用?

我正在寻找任何打字稿装饰的通用解决方案,因为它是可能更新您的装饰检查window.disableLogDecorator标志或在测试过程中关闭它,但这不是可重用的解决方案。


我们使用的情况下,当然,比例如,在更为复杂的规定 - 我们有适用于ngrx/store选择所以他们只在特定状态的部分更新称为@memoizeSelector。由于我们在测试中模拟状态,@memoizeSelector打破了我们的测试,所以我们希望禁用它。

+2

是的,这是可能的,但你需要模拟导出装饰器的模块。你可以使用你的模块加载器来做到这一点,只要它足够灵活。例如,SystemJS可让您轻松完成此操作。请记住,装饰器只是一个功能。 –

回答

-1

我怀疑是否有任何装饰者模拟。您可以将静态开关和处理它装饰的内部或创建配置装饰厂(但还是静态):

@LogCall(LogCallFactory) 

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

装饰器在编译的时候写的,所以大概可以使用条件编译。

+0

“装饰器是在编译时编写的,因此可能可以使用条件编译。”这种说法没有意义 –

+0

你有任何其他的论点? – kemsky

+0

由于语言不支持条件编译,因为装饰器是函数调用的语法糖,所以这个答案没有意义。也许你会被可打印的标准装饰器行为所提供的可选元数据发出混淆,因此认为它们是编译时构造。无论如何,如果从模块导入某些内容,您可以通过适当地配置bundler的加载器来模拟它。 –