2

単体テストを行うために jasmine-node を使用しています。Date.now() をモックするために以下のコードを実行しました

spyOn(Date, 'now').andReturn(1387636363717); //always return a fixed time

その後、実行しようとしましたjasmine-node spec/が、出力がなく動作を停止しました。何が原因なのか見当がつきませんでした。

4

2 に答える 2

6

私は小さなテストを書きました。それはうまく動作します。バージョン 1.11.0 で jasmin-node を使用します。

あなたの Date.now 関数はどこで使用されていますか?

spyOn(Date, 'now').andReturn(1387636363717);
expect(Date.now()).toEqual(1387636363717);
于 2013-12-21T15:50:48.420 に答える
1

問題は、ノード ランタイム ( )に、時間の経過をマークするためにtimers.js呼び出すコードがあることです。Date.now()タイマー ( setTimeout) を設定するコードがあり、そのコードが を使用していないときに実行される場合、次の実際のタイムアウトjasmine.Clockを実行する前に、node.js がしばらく経過するのを待っていることがわかります。このコードは JavaScript ランドの外から呼び出されているように見えるため、JavaScript のシングルスレッドの性質に頼って安全を確保することはできません。スパイにブレークポイントを設定することで、スペックの実行が 1 ミリ秒経過するのを待って無期限に中断されていることがわかりました。.andCallFakeDate.now

非常に大きな単体テスト スイートがありsetTimeout、他の呼び出しの副作用として呼び出され、jasmine.Clockすべての仕様で普遍的に使用されない可能性があるため、これは私にとって問題です。これは最適化の副作用であるため (注: コメントの「オーバーヘッドが多すぎる」)、これは node.js のバグであると考えます。

テストの時間を止めたい場合:

  1. spec 関数内の Date.now をスパイします ( itfunction -not beforeEach)。そうすれば、仕様が遅れることはありません (@marco.jantke がこの問題を認識しなかった理由も説明しています)。
  2. テスト対象のコードでタイマーを使用している場合は、 jasmine.Clock.
于 2014-10-17T19:34:16.977 に答える