2017-10-25 14 views
0

私のmocha.jsテストでは、エラーをスローするasync関数を呼び出していますが、テストは失敗しません。これは、合格とUnhandledPromiseRejectionWarningがあります:内部非同期関数を使用した非同期テストは失敗するはずです

describe('async function', async function() { 
    it('should fail', async function() { 
     [1].forEach(async function() { 
      throw new Error("Why can't I see this error?!"); 
     }); 
    }); 
}); 
単純な場合は、期待通りに動作することを

注:

describe('async function', async function() { 
    it('should fail', async function() { 
     throw new Error('This one fails the test'); 
    }); 
}); 

どのように私が原因内部機能で例外にテストが失敗する原因ことができます?

(私はunhandledRejectionハンドラを追加しようとしましたが、テストはまだ合格)

+0

はこちらのスレッドをチェックアウト:https://stackoverflow.com/questions/14879181/test-for-expected-failureを-in-mocha –

+2

@MihaiAndrici、私は質問とコードを簡潔にするためには言及しなかったが、元のコードでは実際には「スロー」ではなく失敗したチャイの主張である。結果は同じです( 'expect.fail()'はテストを失敗させません)。しかし、とにかく感謝します。 – GilZ

答えて

3

あなたはそれが仕事をしたいよう.forEachとあなたのテストケースが動作することはできません。その非同期コールバックを呼び出すと、コールバックは約束を作成しますが、.forEachは何もしません。 itに渡すコールバックも非同期で、約束を返しますが、それが返す約束は.forEachのコールバックが生成する約束とは関係ありません。だからあなたはUnhandledPromiseRejectionWarningになる。

あなたはPromise.allを通じて約束を接続することによって、問題を解決することができます:あなたの配列は、約束の配列になっているようにmapを使用して

describe('async function', async function() { 
    it('should fail', async function() { 
     return Promise.all([1].map(async function() { 
      throw new Error("Why can't I see this error?!"); 
     })); 
    }); 
}); 

はそれになり、その後、アレイ内のすべての約束のためのPromise.all待ち何か約束が拒否された場合、それを拒否する。 Promise.all呼び出しの戻り値を返すと、Mochaはすべてを待つことができます。

3

ルイの回答はスポット上にあります。別の方法として、あなたは内部機能の使用を避け、代わりに通常のforループを使用することができます。

const data = [1]; 
for (let i = 0; i < data.length; i++) { 
    // await some more stuff here 
    throw new Error('This one fails the test'); 
} 
関連する問題