2017-05-15 17 views
0

私はMochaでテストしていますが、私は約束の解像度から適切な応答を得ていますが、Mochaはタイムアウトによりテストに失敗します。重要な事実は、モカがタイムアウトした後に解決するということです。私は、done()を使用してbefore()フックを使用して、チャイ-約束通りを-使用して、約束を使用してモカの完了、タイムアウトを増やすことthis.timeout(5000)を使用して、とのあらゆるいくつかの順列を試してみたMochaがタイムアウトした後にプロミスが解決する

import chai, { expect } from 'chai'; 
// Needed otherwise Worker is undefined in the test environment 
const Worker = require('webworker-threads').Worker; 

describe('WebWorker',() => { 
    it('should return correctly',() => { 
    return new Promise(res => { 
     const dummyWorker = new Worker('./public/js/worker.bundle.js'); 

     dummyWorker.onmessage = e => { 
     console.log('test message'); // 'test message' prints to testing log 
     res(e.data); 
     }; 

     dummyWorker.postMessage(['foo', 'bar']); 
    }) 
    .then(workerData => { 
     console.log(workerData[0]); // 'foo' prints to testing log 
     expect(workerData[0]).to.equal('foo'); 
    }) 
    .catch(err => console.error(err)); 
    }); 
}); 

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

としかし、何も動作していないようです。

+0

あなたはモカのタイムアウトを拡張する必要があります。 'it' arrow関数を通常の関数として書き直し、' this.timeout(5000) 'の最初の行に追加してください。これにより、モカは少なくとも5秒待ってから不平を言うでしょう。 – MarcoL

+0

@MarcoLご意見ありがとうございました。私も実際にそれを試しましたが、試したことのリストにそれを含めるのを忘れてしまっていました。私は今リストを更新します。 – mythereal

+0

あなたはプロミスを返すので、モカはそれが解決するのを正しく待つべきです。これは、 'dummyWorker.onmessage(...)'が決して呼び出されないことを強く示唆しています。 '。/ public/js/worker.bundle.js'がやっていることを投稿できますか? –

答えて

1

私はnpmパッケージwebworker-threadsに問題を絞り込んでいます。そしてあなたは何を知っていますか?実際には解決されていないissueです。

約束が成立しているのは唯一の問題です。私はdummyWorker.onmessageの中でdone()を使ってみたと思ったが、私は悲しかった。 webworker-threadsでdone()を使用するとうまく動作します。しかし、done()を使用する際の問題は、アサーションエラーがタイムアウトメッセージを返すことだけです。約束があれば、エラーメッセージははるかに具体的です。

こうして、私は別のWebワーカーパッケージ - 小さなワーカーを使用するように切り替えました。今はうまく動作します。あなたは、webworker-スレッドの問題を参照してください外部ファイルを必要とせず、エラーを再現し、以下の簡単な例を参照したい場合に

は:

import { expect } from 'chai'; 
const Worker = require('webworker-threads').Worker; 

describe('web worker',() => { 
    it('should resolve',() => { 
    const p = new Promise(resolve => { 
     const dummyWorker = new Worker(function() { 
     this.onmessage = e => { 
      self.postMessage('foo'); 
     }; 
     }); 

     dummyWorker.onmessage = e => { 
     resolve(e.data); 
     }; 
     dummyWorker.postMessage('foo'); 
    }); 

    return p.then(data => { 
     console.log(data)); 
     expect(data).to.equal('bar'); 
    } 
    }); 
}); 
関連する問題