2016-04-11 15 views
2

私は現在、APM 1.6.0、ノード0.10.40、およびジャスミン1.3を使用して、Atomパッケージの非同期仕様を作成しています。残念ながら私はsetTimeoutを働かせることはできません。setInterval works setTimeout does not

Jasmine 1.3は、非同期テストを可能にするためにruns-blocksというシーケンシャルを使用しているので、私はドキュメントからその例を理解しようとしました。

setTimeout -callbackが呼び出されないことが判明しました。

これが起こる可能性がある理由を探しているうちに、setTimeout文の名前をsetIntervalに変更しました(両方の機能に同じ署名があるため)。

私は

describe('an asynchronous test',() => { 
    it('should do some async stuff',() => { 
     runs(() => { 
      setInterval(() => { 
       console.info('async'); 
      }, 75); 

      setTimeout(() => { 
       console.info('async2'); 
      }, 75); 
     }); 
     waitsFor(() => { 
      return false; 
     }, 'missing events'); // will wait ~5 seconds. 
    }); 
}); 

は、私は次の出力を取得するには、次のコードを実行した場合:

async 
async 
async 
... 

なぜsetTimeoutが完全に機能していない一方で、正常に動作しsetInterval -function?

編集:質問の最初のバージョンでは、仕様がAtom環境で実行されているとは言いませんでした。恩赦。

+2

[私の作品](http://output.jsbin.com/vemayur)(また、ノード上) –

+1

'のみsetTimeout' 75ms後に1回実行されます。出力が足りない可能性はありますか?それはあなたのコンソールの一番上にあります。多分、より高い数字に時間を設定しようとしますか? – Cuthbert

+0

いくつかのテストフレームワークでは、何らかの形で非同期テストを特定する必要があります。ジャスミンに対して正しく動作していることを確認してください。 –

答えて

1

最終的にこれを介して解決策が見つかりましたPost。それはファイルにつながり、setTimeoutはジャスミンスパイによってスタブされます。

setTimeoutをもう一度動作させるには、jasmine.unspy()でスパイを削除する必要があります。 setTimeoutが呼び出された後、spyOn()でスパイを再アクティブ化することは可能です。

次の行は、上から私の例であることを示す:

runs(() => { 
    // disable spy 
    jasmine.unspy(window, 'setTimeout'); 

    setTimeout(() => { 
     console.info('async2'); 
    }, 75); 

    // reenable spy 
    spyOn(window, 'setTimeout') 
     .andCallFake(window.fakeSetTimeout); 
});