2013-03-19 64 views
5

我的Rails應用程序包含一個JavaScript模式,用戶在點擊鏈接後會彈出45秒。結果,我的驗收測試在沒有延遲的情況下通過了,但是失敗了。如何將JavaScript延遲存儲在水豚驗收測試中?

我最初嘗試在我的水豚驗收測試中使用Timecop gem來快進時間,但那並不奏效。然而,當我添加睡眠(45)時,這確實起作用。很明顯,我不能在我的規格中三次睡覺(45次),但是知道做什麼是很好的,所以我可以用更快的方法更接近這一點。

我從我的實驗中得出的結論是,Ruby跟蹤時間,Javascript跟蹤時間,Timecop快速轉發Ruby時間,但不是Javascript時間。有沒有一種方法可以在我的Capybara測試中快速前進45秒,以便我的Javascript事件啓動?

這是導致我的測試中失敗的函數:

 $('.votable').one('click', '.vote', function() { 
      $('.post-vote'). 
      delay(45000). 
      queue(function() { 
       $(this).dialog('open') 
      }); 
     }); 

同樣,當延遲去掉,我的規格傳球,但我需要的延遲。我怎樣才能在我的水豚測試中把它存根?或者我需要用Jasmine測試方法嗎?

+1

可以使延遲的價值動態?而不是等待45k毫秒,你可能會在你的測試環境中有50毫秒的時間;一個更合理的時間量。 – deefour 2013-03-19 01:48:00

+0

@Deefour你的意思是將延遲時間存儲在一個變量中,然後在我的規格中重新定義該變量?這聽起來像個好主意,你能舉個例子嗎? – 2013-03-19 05:54:52

回答

2

最後,這個問題的最簡單的解決方案是讓我的.js文件成爲一個.js.erb文件,然後使用分支來只包含非測試環境中的延遲。不理想,但所有其他解決方案都涉及更多,我絕對不願意將我的測試速度減慢45秒,只是爲了讓我的代碼看起來很漂亮。

最終代碼看起來像這樣:

$('.votable').one('click'). '.vote', function() { 
    $('.post-vote'). 
    <% unless Rails.env.test? %> 
    delay(45000). 
    <% end %> 
    queue(function() { 
    $(this).dialog('open') 
    }); 
});