2017-01-20 11 views
0

私はプロセスをテストし、EPIPEエラーに対して弾力性があることを確認したい。私たちはProdでそれらを見ているので、いくつかのロギングを見逃すこと以外に問題はないようだ。ENOENTやEPIPEのようなシステムエラーを投げる方法はありますか?

Error: write EPIPE 
at errnoException (net.js:770:11) 

throw new Error({code: 'EPIPE', errno: -3})などを試してみましたが、それはちょうど同じように見えるしません:。EPIPEエラーがどのように見える、しかし同じように見ていない

if (process.env.TESTFAIL != null) { 
setTimeout(function() { 
    throw new Error('EPIPE'); 
}, 1000); 

}

nodejs objectsからコード/メッセージを取得してシステムエラーをスローする方法はありますか?

答えて

0

いいえ、ENOENTEPIPE、またはそれに類するものを正確に「スロー」する方法はありません。

単純に言えば、JavaScriptやプログラミング言語の意味でのエラーや例外ではありません。それらはsystem error codesであり、特定の条件が適用されたときにシステムコールまたは標準ライブラリルーチンによって返される(または格納される)整数です。 (そして、通常はUnixやLinuxシステムでも同じ名前が付けられていますが)他のOSでも同じ命名法が採用されています。

意味のある方法でテストを再作成したい場合は、それを引き起こす条件を作成する必要があります。例えば。 ENOENTは、存在しないファイル(パス)を開こうとすると発生します。あなたのテストコードで、ENOENTが発生する条件を再現できるかどうか試してみてください。あなたはEPIPEを得るためにパイプを始めることができます。これは、これらの条件を再現する唯一の意味のある方法です。

言うEPIPE自分自身を呼び出すJavaScriptのレベルでエラーを参照してくださいすることができ、EPIPE値(32)またはEPIPE値または文字列'EPIPE'のいずれかを埋め込むErrorをスローすることが可能です。これらのより高いレベルのエラー兆候は、実際のエラー状態の単なる結果である。根本的な問題に対してコードをテストしたい場合は、一般的に根底にある状況を作成する必要があります。

+0

"一般的に、基本的な状況を作成する必要があります。 EPIPEのためにそれを行う方法のアイデアを得ましたか?それは青色から出現する可能性が最も高いと思われるもの(ログなどに書いている間)です。 – jcollum

+0

確か。パイプを外部プロセスに開始し、データがまだ転送されている間に、外部プロセスをシグナル(例えば 'SIGINT'または' SIGKILL')で終了します。ほとんどの単体テストと比較して調整するのは醜い/複雑なことであり、おそらく統合テストの見出しに該当します。しかし、そうすることは、 'EPIPE'処理をテストする上で必要かつ十分です。 UNIXの 'yes'(無限のシーケンスを出す)のようなユーティリティプログラムは、そのようなテストのための有用な外部関数となり得る。 –

関連する問題