2017-07-14 8 views
1

私にはメソッドデコレータがあります。typescriptデコレータを模擬することは可能ですか?

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

言語は条件付きコンパイルをサポートしていないので、デコレータは関数呼び出しの構文上の砂糖なので、この答えは意味をなさない。多分、あなたは、typescriptがデコレータの標準的なデコレータの動作に加えて提供できるオプションのメタデータのemitと混同されているので、それらがコンパイル時の構造だと思っているかもしれません。とにかくモジュールから何かをインポートした場合は、バンドラーのローダーを適切に設定することでモックできます。 –

関連する問題