计算Ruby中的天数

时间:2016-02-05 11:10:58

标签: ruby cucumber capybara

我有一个问题,如果网页上的某个提醒正确计算总和,我会尝试解决问题。我使用Capybara和Cucumber。

我有一个警报,可以计算在30天内过期的记录。选择此警报时,记录将列在表格中,日期将按以下格式显示," 2016年1月1日"

我想要做的是以某种方式采取今天的日期,将其与表格中返回的日期进行比较,并确保它与警报中的日期相距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

如果有人能想出更简洁的方法,请把我从痛苦中解脱出来。

由于

3 个答案:

答案 0 :(得分:1)

你的尝试至少有几个问题。

  1. 您将日期转换为字符串,然后尝试将时间长度与字符串进行比较。您应该将字符串转换为日期,然后比较它们

  2. #first返回页面中的元素而不是元素的内容

  3. 您的代码并没有100%清楚您正在尝试做什么,但从测试命名来看,我认为您只是想确保第3个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选项以确保它等待匹配元素出现在页面上(如果这是点击按钮后转到第一步的第一步)例如新页面)

答案 1 :(得分: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 好的,我终于有时间更全面地看一下了。你不需要所有这些巫术魔法与天微积分:

 # 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
   ...

希望它有所帮助。

答案 2 :(得分:0)

我强烈建议不要使用Cucumber进行此类测试。你会找到它:

  1. 很难设置
  2. 运行成本高
  3. 没有足够的好处来证明设置/运行时成本合理
  4. 而是考虑编写提供日期的事物的单元测试。通常,良好的单元测试可以比场景快10到100倍。

    虽然只有一个场景,你不会经历那么多痛苦,一旦你有很多这样的场景,痛苦就会累积起来。使用Cucumber的部分技巧是为你写的每个场景获得大量的爆炸。