2013-12-21 31 views
1

我使用茉莉節點做單元測試。我做了下面的代碼嘲諷Date.now()間諜上Date.now()導致茉莉節點沒有響應

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

然後我試圖運行jasmine-node spec/,但它停止,沒有輸出工作。我無法弄清楚是什麼原因。

回答

4

我已經寫了一個小測試。它工作得很好。在版本1.11.0中使用jasmin-node。

在使用你的Date.now功能呢?

spyOn(Date, 'now').andReturn(1387636363717); 
expect(Date.now()).toEqual(1387636363717); 
+0

我的代碼是完全一樣的代碼。我的茉莉花節點版本是1.12.0 – Shuping

+0

我也試過茉莉花節點1.11.0,同樣的問題。操作系統是Ubuntu 12.不知道爲什麼在Date.now上偵測導致jasmine-node無法正常工作。 – Shuping

0

的問題是,有在節點運行時(timers.js)代碼調用Date.now()標記的時間的流逝。如果你有一些代碼設置一個計時器(setTimeout),雖然沒有使用jasmine.Clock被執行的代碼,那麼你會發現node.js中等待一段時間才能執行下一個真正超時前經過。由於此代碼看起來是從外部javascript土地調用的,因此您無法依賴JavaScript的單線程本質來保證您不受此影響。通過在Date.now間諜上設置一個斷點.andCallFake,我能夠看到規範的執行被無限期暫停,等待一毫秒的時間。

這對我來說是一個問題,因爲我們有一個非常大的單元測試套件,並且有可能將setTimeout稱爲其他調用的副作用,並且jasmine.Clock在每個規範中都沒有普遍使用。由於這是優化的副作用(注意:註釋中的'開銷太多'),我會認爲這是node.js中的一個錯誤。

如果你想停止時間爲你的測試:

  1. 窺探Date.now您的規格函數內(it功能 - 不beforeEach)。這樣你的規格不會被延遲(也解釋了爲什麼@ marco.jantke沒有看到這個問題)。
  2. 如果被測代碼使用定時器,可使用jasmine.Clock