我有一个问题,如果网页上的某个提醒正确计算总和,我会尝试解决问题。我使用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
如果有人能想出更简洁的方法,请把我从痛苦中解脱出来。
由于
答案 0 :(得分:1)
你的尝试至少有几个问题。
您将日期转换为字符串,然后尝试将时间长度与字符串进行比较。您应该将字符串转换为日期,然后比较它们
#first
返回页面中的元素而不是元素的内容
您的代码并没有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进行此类测试。你会找到它:
而是考虑编写提供日期的事物的单元测试。通常,良好的单元测试可以比场景快10到100倍。
虽然只有一个场景,你不会经历那么多痛苦,一旦你有很多这样的场景,痛苦就会累积起来。使用Cucumber的部分技巧是为你写的每个场景获得大量的爆炸。