102

この問題について何らかの助けが得られることを願っています。作成中のアプリケーションのテストを作成しようとしています。問題を次のサンプル コードにまとめました。エラーがスローされたことをテストしたい。テスト ランナーとして Testacular を使用し、モカをフレームワークとして、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");
        });
    });
});
4

3 に答える 3

149

assert.throws()関数を正しい方法で渡していません。

関数は、最初のassert.throws()パラメーターとして関数を想定しています。コードでは、iThrowError を呼び出し、呼び出し時にその戻り値を渡していますassert.throws()

基本的に、これを変更します:

assert.throws(iThrowError(), Error, "Error thrown");

これに:

assert.throws(iThrowError, Error, "Error thrown");

あなたの問題を解決するはずです。

引数付き:

assert.throws(() => { iThrowError(args) }, Error);

また

assert.throws(function() { iThrowError(args) }, Error, /Error thrown/);
于 2013-07-22T17:14:04.170 に答える
40

一番上の答えに加えて、テストの一部として関数を呼び出す必要がある場合 (つまり、関数は特定のパラメーターが渡された場合にのみエラーをスローする必要があります)、関数呼び出しを匿名関数でラップするか、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");
于 2016-11-07T20:06:44.663 に答える
26

問題を解決できたのに、特定のエラーを確認できなかったようです。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/);

お役に立てれば!

于 2013-02-21T18:53:49.530 に答える