2017-11-15 8 views
1

それを呼び出していないにも関わらず、ユニットテストで実行されていますm 決してメソッドを呼び出すと、呼び出されます。これは、consoleステートメントの代わりにLoggerFactoryを使用しようとしているため、問題です。単体テストを実行すると、NgLifecycleLog()の呼び出しが行われ、LoggerFactoryのインスタンスが作成されます。エクスポートされた関数は、私は以下のクラスを持っているん

これはなぜ呼び出されますか?私はテストでfdescribeを実行しようとしましたが、これが実行されている唯一のものであることを確認しても、それは修正されません。

+0

const lifecycleLogger = LoggerFactory.getLogger(NAME); LIFECYCLE_HOOKS.forEach(hook => { const original = constructor.prototype[hook]; constructor.prototype[hook] = function(...args) { lifecycleLogger.info('${hook}', ...args); original.apply(this, args); }; }); 

lifecycleLoggerは、それが、それが実際に使用される場所へのクラスの装飾に呼び出された場所から移動する必要があります呼び出されたので呼ばれます。あなたは何かを飾るためにこのデコレータを作ったのですか?それが使われていないなら、それはなぜそこにあるのですか?コードベースから削除すると、どこに呼び出されたのかがわかります。 – estus

+0

ええ、私はコンポーネントで使用します。私はコンポーネントをテストしていません。単体テストを実行し、 'fdescribe'を実行している場合、そのデコレータを使用する機会は決してありません。ユニットテストを実行していて、ユニットテストが**それを呼び出すことがないのはなぜですか? – Nxt3

+1

デコレータがどのように動作するか誤解していると思います。装飾クラスが定義されると、クラス装飾は一度実行されます。テスト済みのクラスがテストバンドルに含まれていた場合、デコレータ関数が呼び出されます。これで問題が生じた場合、デコレータは間違った方法で設計されていました。私はあなたの本当のコードを反映するためだけにではなく、console.errorの質問を更新することをお勧めします。 – estus

答えて

1

装飾クラスが定義されると、クラスデコレータは一度実行されます。装飾されたクラスがテストバンドルに含まれていた場合、デコレータ関数が呼び出されます。

デコレータ関数が副作用を引き起こすか、または他のユニットを含む場合(これは単体テストに影響する可能性があります)、リファクタリングする必要があります。この場合

デコレータパッチクラスプロトタイプのメソッド:

LIFECYCLE_HOOKS.forEach(hook => { 
    const original = constructor.prototype[hook]; 

    constructor.prototype[hook] = function(...args) { 
    const lifecycleLogger = LoggerFactory.getLogger(NAME); 
    lifecycleLogger.info(`${hook}`, ...args); 
    original.apply(this, args); 
    }; 
}); 
+0

それはそれを修正しました。ありがとうございました! – Nxt3

+1

ようこそ。また、LoggerFactory.getLogger(NAME)呼び出しは、必要に応じてメモ帳やローカル変数にキャッシュすることができますが、Logger.get(js-logger lib)が既にそうしているため、そうでないようです。 – estus

関連する問題