2012-03-13 38 views
1

我有一個問題,我正在驗證當前時間已被插入到HTML中(用於使用JavaScript做一類time_ago)。Rspec請求測試中的競爭條件

當前的UNIX時間(時期)呈現在給定的HTML元素的數據的數據屬性,在這種情況下是這樣的:

<a href="/somewhere" data-last-points-awarded-at="1331606458">Something Happend</a> 

但是,當我運行測試:

recipe = Factory(:recipe, name: "Apple Pie", user: @user) 

visit some_path 

time_in_layout = find('a[data-last-points-awarded-at]')['data-last-points-awarded-at'] 
current_time = Proc.new { Time.now }.call.to_i.to_s 

time_in_layout.should eql(current_time) 

一旦運行我的測試失敗......但只是勉強:

Failure/Error: time_in_layout.should eql(current_time) 

    expected: "1331606459" 
     got: "1331606458" 

    (compared using eql?) 

一切都很好,測試幾乎是我真的希望它能夠工作,但是,proc返回一秒鐘後的時間,我該如何解決這個問題?就像我在測試開始時如何鎖定時間一樣,我甚至可以做這樣的事情嗎?

回答

2

檢查出TimeCop,因爲它確實如你所願。

+0

這看起來很酷!但只是一個測試的完整寶石?這是過度殺傷力?這可能是我唯一的選擇。 – 2012-03-13 03:36:04

+0

您只能將它加載到:測試環境中,但每個gem都會添加一些加載時間,如果您不小心,則對Time類進行混亂可能會導致其他測試產生意想不到的後果。 – 2012-03-13 03:45:39

+0

更好的方法是在撥打電話之前嘲笑時間。這在單元測試級別上效果更好,但如果您在單元級別測試它,則可以在請求級別測試其他內容(例如顯示時間並且在合理範圍內)。 – 2012-03-13 03:46:39