11

モカのウェブサイトは次のように述べています。

「さらに簡単にするために、done() コールバックはエラーを受け入れるので、これを直接使用できます: [例を参照]」

それでは、それを試してみましょう:

it('works',function(done){
  expect(1).to.be(1)
  done( new Error('expected error') )
})
/* Insert the error manually for testing and clarity. */

それを実行して:

1 failing

1) works:
 Error: expected error
  at Context.<anonymous>
  [stack trace]

エラー応答が望ましい結果である場合、どうすればテストをパスできるでしょうか?

4

2 に答える 2

22

それは非同期ではありません。コールバック関数は、非同期コードをテストしていることをモカに通知するためのものであり、コールバック関数を呼び出すまでモカは次のテストを実行すべきではありません。これは、コールバック関数の使用方法の例です。

it('works',function(done){
    setTimeout(function(){
        // happens 0.5 seconds later:
        expect(1).to.be(1);
        done(); // this tells mocha to run the next test
    },500);
});

また、mocha は、非同期であろうとなかろうと、いかなる形式の例外も処理しません。それは、選択した例外ライブラリに任せます。あなたの場合、あなたは使用していexpect.jsますか?throwExceptionその場合、expect はメソッド ( とも呼ばれthrowErrorます)を介して予想されるエラーを処理します。

it('throws an error',function(done){
    expect(function(){
        throw new Error('expected error');
    }).to.throwError(/expected error/);
});

現在、一般に、node.js の非同期コードはエラーをスローしません。代わりに、エラーをパラメーターとしてコールバックに渡します。したがって、非同期エラーを処理するには、err オブジェクトを確認するだけです。

// using readFile as an example of async code to be tested:
it('returns an error',function(done){
    fs.readFile(filename, function (err, data) {
        expect(err).to.be.an(Error);
        done(); // tell mocha to run next test
    })
});

したがってto.throwError()、同期エラーをチェックしているto.be.an(Error)場合と非同期エラーをチェックしている場合に使用します。


その他の注意事項:

これを初めて見たときは、ビックリしました。唯一の違いは、渡した関数が引数を受け入れるかどうかだけである場合、モカはテストが同期か非同期かをどのように知ることができますか? あなたが私のようで、どのように頭を悩ませているかを考えている場合に備えて、javascript のすべての関数にはlength、宣言で受け入れる引数の数を記述するプロパティがあることを学びました。いいえ、それではなく、arguments.length関数自身のlength. 例えば:

function howManyArguments (fn) {
    console.log(fn.length);
}

function a () {}
function b (x) {}
function c (x,y,z) {}

howManyArguments(a); // logs 0
howManyArguments(b); // logs 1
howManyArguments(c); // logs 3
howManyArguments(howManyArguments); // logs 1
howManyArguments(function(x,y){}); // logs 2

したがって、モカは基本的に関数の長さをチェックして天気を判断し、同期関数または非同期関数として処理し、非同期done()の場合はコールバックを待って実行を一時停止します。


さらに追加の注意事項:

Mocha は、他のほとんどの js 単体テスト ランナーやライブラリと同様に、エラーをキャッチすることで機能します。expect(foo).to.be.an.integer()そのため、アサーションが失敗した場合に関数がエラーをスローすることを期待しています。これが、mocha が expect や chai などのアサーション ライブラリと通信する方法です。

さて、上で述べたように、ノードの一般的なイディオムは、非同期関数はエラーをスローせず、最初の引数としてエラー オブジェクトを渡すというものです。これが発生すると、 mocha はエラーを検出できないため、失敗したテストを検出できません。これを回避するには、エラー オブジェクトを非同期コードからコールバック関数に渡すと、スローされたエラーと同じように処理されます。

したがって、上記の私の例の1つを取り上げます。

it('executes without errors',function(done){
    fs.readFile(filename, function (err, data) {
        done(err); // if err is undefined or null mocha will treat
                   // it as a pass but if err is an error object
                   // mocha treats it as a fail.
    })
});

または単に:

it('executes without errors',function(done){
    fs.readFile(filename,done);
});    

厳密に言えば、この機能は、返されたエラー オブジェクトを手動でチェックできるようにする expect.js などのライブラリと一緒に使用すると少し冗長になりますが、アサーション ライブラリがエラー オブジェクトをチェックできない場合 (または実際にはチェックしない場合) に役立ちます。非同期関数の結果を気にしているが、エラーがスローされていないことを知りたいだけです)。

于 2013-10-13T00:33:00.690 に答える