2017-03-27 9 views
0

私は以下のようなテストをしています。基本的には、特定のメソッドが遅延しているかどうかをテストしたい。Sinonの偽のタイマーを使用している間にsetTimeoutがトリガーされない

次の例は、resolveメソッドが呼び出されます。すなわち、期待どおりに動作し、テストに合格:

it(`should delay execution by 1 second`, function() { 
    const clock = sandbox.useFakeTimers(); 

    const p = new Promise(function (resolve) { 
    setTimeout(resolve, 1000); 
    }); 

    clock.tick(1000); 

    return p; 
}); 

をしかし、私は別の約束でのsetTimeoutをラップする場合は、決意が呼び出されることは決してありません:

it(`should delay execution by 1 second`, function() { 
    const clock = sandbox.useFakeTimers(); 

    const p = Promise.resolve() 
    .then(() => { 
     return new Promise(function (resolve) { 
     setTimeout(resolve, 1000); // resolve never gets called 
     }); 
    }); 

    clock.tick(1000); 

    return p; 
    }); 

ここで問題は何ですか?

私はSinon 2.1.0と本来の約束をNode 6.9.5に使用しています。

答えて

5

タイムアウトが開始する前にクロックをチェックしていることが問題です。これは、2番目のスニペットで約束のコールバックで非同期的に発生します。

これは動作するはずです:

it(`should delay execution by 1 second`, function() { 
    const clock = sandbox.useFakeTimers(); 

    return Promise.resolve().then(() => { 
    return new Promise(function (resolve) { 
     setTimeout(resolve, 1000); // resolve never gets called 
     clock.tick(1000); 
    }); 
    }); 
}); 
+0

は、いくつかの変更をしなければならなかったが、これは正しい道に私を導きました!ありがとう:) –

+0

あなたは内側の約束を変更することができなかった場合はどうしますか?ここにclock.tickを置くことはできませんが、setTimeoutが解決するのを待っています。 –

+0

@FélixBrunet 'setTimeout'コールの後ろにクリックティックを置く必要があります。それは「新しい約束」の後にも働くだろう。 – Bergi

関連する問題