Sinon: 新しいエラーオブジェクトの作成を拒否するにはどうすればよいですか?

作成日 2018年02月01日  ·  6コメント  ·  ソース: sinonjs/sinon

https://github.com/sinonjs/sinon/blob/4310343393b16b92b56526ab4614da4eb2886efa/lib/sinon/default-behaviors.js#L176

文字列を拒否するコードを維持していますが、これによりテスト中に問題が発生します。 ブルーバードの捕獲物が正しく動作していません。

bluebird.rejects('Something')
    .catch(e => e === 'Something' /* true */, () => console.log(typeof e) /*string*/)
    .catch(() => console.log('should not be here'));

ただし、 sinon.stub().usingPromise('bluebird').rejects('Something');すると、Somethingという名前のエラーオブジェクトが作成されます。 まったく期待されていません。

ネイティブのPromiseのみをサポートしていると誰かが言う前に、彼らが何をしているのかを調べてみましょう。

Promise.reject('Something')
     .catch(e => {
        console.log(e === 'Something'); // true
        console.log(typeof e); // string
    });

うーん、彼らはErrorクラスを作成しません、彼らはそれがスローのように与えられた例外を投げるだけです。

try { 
    throw 'Something'; 
} catch (e) { 
    console.log(e === 'Something');  // true
    console.log(typeof e); // string
}
Bug Help wanted pinned

最も参考になるコメント

スタックトレースの有用性と、エラーオブジェクトを作成する必要があるかどうかについての議論は、一般的に同意します

const example = sinon.stub().rejects(something);

と同じように動作する必要があります

const example = () => Promise.reject(something);

現在、 somethingが文字列の場合、これは当てはまりません。 現在の動作はバグだと思います。

全てのコメント6件

ネイティブのPromiseのみをサポートしていると誰かが言う前に、彼らが何をしているのかを調べてみましょう。

それはストローマンの誤謬です。 例で使用しているように、promiseライブラリをサポートすることは十分にご存知でしょう。

Sinonのメンテナは、JavaScriptのpromiseがどのように機能するかを完全に認識しています。これには、 Promise.reject()が渡されたものすべてを渡すことも含まれます。

文字列を拒否するコードを維持しています

私の意見では、との約束を拒否Stringの代わりにError本当に私たちが今日書いたものをデバッグする必要があります。今後の開発にひどい仕打ちをしています。 文字列はスタックトレースをキャプチャしないため、デバッグにはあまり役立ちません。 Errorはそうです。 したがって、 rejects()動作が望ましいと思います。これにより、デバッガーを使用して問題をすばやく見つけることが容易になります。

あなたは同意しないようですが、あなたがした唯一の声明は、シノンがあなたの期待に応えていないということです。 デフォルトの動作を変更する必要があると思われる場合は、変更が多くの​​ユーザーに影響を与える可能性があることを念頭に置いて、理由についての議論を投稿してください。

デフォルトの動作を変更するための確固たる議論がある場合、Sinonのメンテナの誰もがそれを変更するためのプルリクエストに反対することは想像できません。

この問題は、最近のアクティビティがないため、自動的に古いものとしてマークされています。 それ以上のアクティビティが発生しない場合は閉じられます。 貢献していただきありがとうございます。

特定のシナリオでスタックトレースが実際に役立つかどうかについては、意見が異なる可能性があると思います。 私の特定の状況では、実際にはスタックトレースは気にせず、エラーメッセージだけを気にして、それを別の場所に渡します。 したがって、文字列とエラータイプの両方の拒否理由を処理するコードを記述しました。 ただし、sinonは文字列->エラー強制を実行するため、文字列を処理するコードのブランチをテストできません。 そのため、完全にカバーすることはできません

スタックトレースの有用性と、エラーオブジェクトを作成する必要があるかどうかについての議論は、一般的に同意します

const example = sinon.stub().rejects(something);

と同じように動作する必要があります

const example = () => Promise.reject(something);

現在、 somethingが文字列の場合、これは当てはまりません。 現在の動作はバグだと思います。

同意する。

この問題は、最近のアクティビティがないため、自動的に古いものとしてマークされています。 それ以上のアクティビティが発生しない場合は閉じられます。 貢献していただきありがとうございます。

このページは役に立ちましたか?
0 / 5 - 0 評価