単体テストを行うために jasmine-node を使用しています。Date.now() をモックするために以下のコードを実行しました
spyOn(Date, 'now').andReturn(1387636363717); //always return a fixed time
その後、実行しようとしましたjasmine-node spec/
が、出力がなく動作を停止しました。何が原因なのか見当がつきませんでした。
単体テストを行うために jasmine-node を使用しています。Date.now() をモックするために以下のコードを実行しました
spyOn(Date, 'now').andReturn(1387636363717); //always return a fixed time
その後、実行しようとしましたjasmine-node spec/
が、出力がなく動作を停止しました。何が原因なのか見当がつきませんでした。
私は小さなテストを書きました。それはうまく動作します。バージョン 1.11.0 で jasmin-node を使用します。
あなたの Date.now 関数はどこで使用されていますか?
spyOn(Date, 'now').andReturn(1387636363717);
expect(Date.now()).toEqual(1387636363717);
問題は、ノード ランタイム ( )に、時間の経過をマークするためにtimers.js
呼び出すコードがあることです。Date.now()
タイマー ( setTimeout
) を設定するコードがあり、そのコードが を使用していないときに実行される場合、次の実際のタイムアウトjasmine.Clock
を実行する前に、node.js がしばらく経過するのを待っていることがわかります。このコードは JavaScript ランドの外から呼び出されているように見えるため、JavaScript のシングルスレッドの性質に頼って安全を確保することはできません。スパイにブレークポイントを設定することで、スペックの実行が 1 ミリ秒経過するのを待って無期限に中断されていることがわかりました。.andCallFake
Date.now
非常に大きな単体テスト スイートがありsetTimeout
、他の呼び出しの副作用として呼び出され、jasmine.Clock
すべての仕様で普遍的に使用されない可能性があるため、これは私にとって問題です。これは最適化の副作用であるため (注: コメントの「オーバーヘッドが多すぎる」)、これは node.js のバグであると考えます。
テストの時間を止めたい場合:
it
function -not beforeEach
)。そうすれば、仕様が遅れることはありません (@marco.jantke がこの問題を認識しなかった理由も説明しています)。jasmine.Clock
.