2016-02-05 132 views
0

我有一個問題,我試圖解決網頁上的某個警報是否正確計算總和。我正在使用水豚和黃瓜。在Ruby中計算天數

我有一個計算在30天內到期的記錄的警報。當選擇此提醒時,記錄被列在一張表格中,並且日期以以下格式顯示:「1 feb 2016」

我想要做的是以某種方式取今天的日期,將它與在並確保它距離警報日期大於等於30天。

我能出今天的日期作爲使用相同的格式Time.strftime等

當我嘗試了諸如:

And(/^I can see record "([\d]*)" MOT is calculated due within 30 days$/) do |selection1| 


    today = Time.now.strftime('%l %b %Y') 
    thirty_days = (today + 30) 
    first_30day_mot = first('#clickable-rows > tbody > tr:nth-child(' + selection1 + ') > td:nth-child(3)') 

if today + first_30day_mot <= thirty_days 
    puts 'alert correct' 
else 
    (error handler here) 
    end 
end 

正如你可以看到,這是一個相當混亂。

我不斷收到錯誤TypeError: no implicit conversion of Fixnum into String

如果任何人都可以想到的更合適的方法來做到這一點,請把我從我的痛苦。

感謝

+0

'first_30day_mot'是最有可能的字符串。可能是'to_i'會幫助 –

+0

我嘗試過,但同樣的錯誤出現了。 – Tom

+0

每當您嘗試將整數添加到字符串或任何類似的操作時,都會出現該錯誤。您可以通過檢查報告錯誤的行號處的值來調試代碼。 –

回答

1

你的嘗試至少有兩件事情是錯誤的。

  1. 您將日期轉換爲字符串,然後嘗試比較字符串的時間長度。你應該將字符串轉換爲日期,然後比較它們

  2. #first返回頁面不是元素

的它不是100%清楚你的代碼的內容你要什麼樣的元素但是從測試命名我想你只是想確保給定行的第三個td單元格(它是2016年1月2日格式)中的日期距離現在還不到30天。如果是的話下面應該做你想要

mot_element = first("#clickable-rows > tbody > tr:nth-child(#{selection1}) > td:nth-child(3)") 
date_of_mot = Date.parse(mot_element.text) 

if (date_of_mot - Date.today) < 30 
    puts 'alert correct' 
else 
    #error handler 
end 

除此之外什麼,我不知道爲什麼你使用#first與選擇,因爲它看起來像它應該永遠只在頁面上匹配一個元素,因此你可能想把它換成#find,這會給你帶來Capybaras等待行爲的好處。如果你實際上需要#first,你可以考慮通過minimum: 1選項來確保它等待匹配元素出現在頁面上(如果這是單擊按鈕進入新頁面後的第一步,例如)

+0

謝謝,這正在做我所需要的。我對此很新,所以我對代碼感到困惑。 – Tom

0

轉換selection1字符串明確(或更好,使用字符串插值):

first_30day_mot = first("#clickable-rows > tbody > tr:nth-child(#{selection1}) > td:nth-child(3)") 

而且,我懷疑它下面一行應轉換爲整數,將其添加到today

first_30day_mot.to_i <= 30 

UPD OK,我終於有時間採取一個更徹底的樣子。你不需要所有這些巫術魔法與微積分:

# today = Time.now.strftime('%l %b %Y') # today will be a string " 3 Feb 2016" 
# thirty_days = (today + 30) this was causing an error 

# correct: 

# today = DateTime.now # correct, but not needed 
# plus_30_days = today + 30.days # correct, but not needed 
first_30day_mot = first("#clickable-rows > tbody > tr:nth-child(#{selection1}) > td:nth-child(3)") 

if 30 > first_30day_mot.to_i 
    ... 

希望它有幫助。

+0

我沒有太多的運氣。你認爲,捕獲xpath/css中的文本,然後使用Date.strptime將其轉換爲int會更好嗎?另外改變今天的輸出爲int – Tom

+0

請看更新,我再看一眼代碼。 – mudasobwa

0

我強烈建議不要使用黃瓜做這樣的測試。你會發現它的:

  1. 挺難設立
  2. 具有較高的運行成本
  3. 不給予足夠的利益來證明安裝/運行成本

而是考慮寫對提供日期的事物進行單元測試。一般來說,好的單元測試可以比場景輕鬆運行10到100倍。

雖然有一個情況下,您將不會遇到那麼多的痛苦,一旦你有很多像這樣的痛苦會積累場景。部分使用Cucumber的藝術是爲您寫的每個場景獲得充足的音樂。