私はこの問題の助けを見つけたいと思っています。作成中のアプリケーションのテストを作成しようとしています。問題を次のサンプルコードに抽出しました。エラーがスローされたことをテストしたい。テストランナーとしてTestacularを使用し、フレームワークとしてmochaを使用し、アサーションライブラリとしてchaiを使用しています。テストは実行されますが、エラーがスローされたためテストは失敗します!どんな助けも大歓迎です!
function iThrowError() {
throw new Error("Error thrown");
}
var assert = chai.assert,
expect = chai.expect;
describe('The app', function() {
describe('this feature', function() {
it("is a function", function(){
assert.throw(iThrowError(), Error, "Error thrown");
});
});
});
正しい方法で関数をassert.throws()
に渡していない。
assert.throws()
関数では、最初のパラメーターとして関数が必要です。コードでは、assert.throws()
を呼び出すときにiThrowErrorを呼び出し、その戻り値を渡します。
基本的に、これを変更します:
assert.throws(iThrowError(), Error, "Error thrown");
これに:
assert.throws(iThrowError, Error, "Error thrown");
あなたの問題を解決するはずです。
トップアンサー に追加して、テストの一部として関数を呼び出す必要がある場合(つまり、特定のパラメーターが渡された場合のみ関数がエラーをスローする必要がある場合)、関数呼び出しを匿名でラップできます関数、またはES6 +では、矢印関数式で関数を渡すことができます。
// Function invoked with parameter.
// TEST FAILS. DO NOT USE.
assert.throws(iThrowError(badParam), Error, "Error thrown"); // WRONG!
// Function invoked with parameter; wrapped in anonymous function for test.
// TEST PASSES.
assert.throws(function () { iThrowError(badParam) }, Error, "Error thrown");
// Function invoked with parameter, passed as predicate of ES6 arrow function.
// TEST PASSES.
assert.throws(() => iThrowError(badParam), Error, "Error thrown");
そして、完全を期すために、ここにもっと文字通りのバージョンがあります:
// Explicit throw statement as parameter. (This isn't even valid JavaScript.)
// TEST SUITE WILL FAIL TO LOAD. DO NOT USE, EVER.
assert.throws(throw new Error("Error thrown"), Error, "Error thrown"); // VERY WRONG!
// Explicit throw statement wrapped in anonymous function.
// TEST PASSES.
assert.throws(function () { throw new Error("Error thrown") }, Error, "Error thrown");
// ES6 function. (You still need the brackets around the throw statement.)
// TEST PASSES.
assert.throws(() => { throw new Error("Error thrown") }, Error, "Error thrown");
問題を解決できたが、特定のエラーを確認できなかったことがわかりました。 Chaiのexpect/should構文を使用してこれを行うには、 throw() のさまざまなシグネチャのパラメーターを使用できます。
@param{ ErrorConstructor } constructor
@param{ String | RegExp } expectederror message
@param{ String } message _optional_
この例では、次のいずれかを使用できるはずです。
expect(iThrowError).to.throw(/Error thrown/);
expect(iThrowError).to.throw(Error, /Error thrown/);
expect(iThrowError).to.throw(new Error('Error thrown'));
そして(再び、chaiのドキュメントから)、次を使用して他のエラーメッセージをフィルタリングできます。
expect(iThrowError).to.throw(Error).and.not.throw(/Another Error thrown/);
お役に立てれば!