2017-08-23 14 views
1

私は現在サイロンを学んでいます。マイコード:モカの約束遅れ

const bluebird = require('bluebird'); 
const sinon = require('sinon'); 
const sinonTest = require('sinon-test')(sinon); 

sinon.test = sinonTest; 

describe('xxx', function _test() { 
    this.timeout(2000); 
    it('should', sinon.test(function() { 
    return new bluebird.Promise((resolve, reject) => { 
     try { 
     console.log('123'); 
     resolve(); 
     } catch (err) { 
     reject(err); 
     };  
    }) 
    .then(() => console.log('456')) 
    .delay(100) 
    .then(() => console.log('789')) 
    .then(function() { 
    }) 
    })); 
}); 

出力:

xxx 
    123 
    456 

なぜ上記のコードはタイムアウトしdelayで立ち往生?おかげ

UPDATE

const bluebird = require('bluebird'); 
const sinon = require('sinon'); 
const sinonTest = require('sinon-test')(sinon); 

sinon.test = sinonTest; 

describe('xxx', function _test() { 
    this.timeout(2000); 
    it('should', sinon.test(function() { 
    return bluebird 
    .delay(100) 
    .then(() => console.log('789')); 
    })); 
}); 

出力:

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

UPDATE

おかげ@Louis。 useFakeTimersの設定は問題ありません。

しかし、私はちょうど混乱しています。なぜ私のプロジェクトでは、既存のテストに問題はありません。useFakeTimersがデフォルトでtrueに設定されていますか? useFakeTimersがtrueに設定されている場合、sinonTest()では約束遅延を使用できませんか?

ちなみにsinon1.17.6から2.4.1にアップグレードすると、この問題が発生しました。 ありがとう

答えて

0

デフォルトでは、Sinonが作成するサンドボックスは、サンドボックス設定オプションuseFakeTimerstrueになるように設定されています。 (documentation pagedefaultConfigを検索してください)

これは、サンドボックスが有効な間に時計が停止しているように見え、Bluebirdのdelayが決して解決しないことを意味します。 sinon-testには、2番目のパラメータを設定するときに、偽のタイマーなしでサンドボックスを作成するように指示します。この第二のパラメータは、実際にSinonのサンドボックスのための設定オブジェクトです:

const sinonTest = require('sinon-test')(sinon, 
             { useFakeTimers: false }); 

私はそれを試していないが、しかし、あなたはいくつかのテストを使用する必要がある場合は、同時に複数の構成を使用することができますようなコードをeyeballingから、それが見えます擬似タイマーを使用しないでください:

const sinonTest = require('sinon-test'); 
const wrapper = sinonTest(sinon, { useFakeTimers: false }); 
const wrapperWithTimers = sinonTest(sinon); 

テストの必要性に応じて適切なラッパーを使用するだけで済みます。


あなたは質問を追加しました:

をしかし、私はちょうど混乱しています。なぜ私のプロジェクトでは、既存のテストに問題はありません。useFakeTimersがデフォルトでtrueに設定されていますか? useFakeTimersがtrueに設定されている場合、sinonTest()では約束遅延を使用できませんか?デフォルトuseFakeTimersことで

trueですが、あなたはが正しく動作するために前進したクロックにを依存していること、コードを持っていない限り、それが問題を引き起こすことはありません。私はサンドボックスを使用するテストスイートがたくさんあります。私は偽のタイマーをオフにしないように気を配っていましたが、うまく動作します。偽のタイマーはではありません。一般には、非同期関数の実行を防ぎます。サンドボックスが有効になっている間にfs.readFileを実行すると、うまくいくはずです。 setTimeout,setIntervalDateのように、クロックに依存する関数にのみ影響します。

ブルーバードのdelayメソッドは、calls setTimeoutのため影響を受けます。

+0

'{useFakeTimers:false}'が設定されている場合、 'delay'は動作しませんか? – BAE

+0

私はあなたの質問でコードを取り、新しいファイルに置き換え、2番目のパラメータ '{useFakeTimers:false}'を追加して編集し、必要なパッケージをインストールしてMochaを実行して動作させます。私はすべての 'console.log'出力を得て、タイムアウトはありません。それは私の答えを書く前にそれをやったときに機能し、今は動作します。あなたは間違ったことをしているに違いない。 – Louis

+0

はい。それは今働いている。あなたは私のいくつかの質問を解決しました。ありがとう。しかし、私はちょうど混乱しています。なぜ私のプロジェクトでは 'useFakeTimers'が設定されていない既存のテストに問題はありませんか? – BAE