是否有可能模拟打字稿装饰?
鉴于我有方法装饰器,例如是否有可能模拟打字稿装饰?
class Service {
@LogCall()
doSomething() {
return 1 + 1;
}
}
是否有可能嘲笑在单元测试@LogCall
装饰,所以它不会被应用或与嘲笑逻辑应用?
我正在寻找任何打字稿装饰的通用解决方案,因为它是可能更新您的装饰检查window.disableLogDecorator
标志或在测试过程中关闭它,但这不是可重用的解决方案。
我们使用的情况下,当然,比例如,在更为复杂的规定 - 我们有适用于ngrx/store
选择所以他们只在特定状态的部分更新称为@memoizeSelector
。由于我们在测试中模拟状态,@memoizeSelector
打破了我们的测试,所以我们希望禁用它。
我怀疑是否有任何装饰者模拟。您可以将静态开关和处理它装饰的内部或创建配置装饰厂(但还是静态):
@LogCall(LogCallFactory)
export function LogCall(factory:Function):Function
{
return function(target:Object, propertyKey:string, descriptor:TypedPropertyDescriptor<any>)
{
return factory(target, propertyKey, descriptor);
}
}
装饰器在编译的时候写的,所以大概可以使用条件编译。
“装饰器是在编译时编写的,因此可能可以使用条件编译。”这种说法没有意义 –
你有任何其他的论点? – kemsky
由于语言不支持条件编译,因为装饰器是函数调用的语法糖,所以这个答案没有意义。也许你会被可打印的标准装饰器行为所提供的可选元数据发出混淆,因此认为它们是编译时构造。无论如何,如果从模块导入某些内容,您可以通过适当地配置bundler的加载器来模拟它。 –
是的,这是可能的,但你需要模拟导出装饰器的模块。你可以使用你的模块加载器来做到这一点,只要它足够灵活。例如,SystemJS可让您轻松完成此操作。请记住,装饰器只是一个功能。 –