2017-07-14 60 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的加載器來模擬它。 –