【问题标题】:Timestamps Ruby Capybara Cucumber时间戳红宝石水豚黄瓜
【发布时间】:2016-04-12 23:01:29
【问题描述】:

我有一个测试,在成功交易后生成参考号。在此参考编号内是 (hhmmss) 的时间戳。此时间戳是在用户按下提交时捕获的,而不是在出现确认页面且参考号可见时捕获的。因此,我不能使用 Time.now,因为它总是错误的。

我想做的(如果可能的话)是创建一个确认测试,我在参考号内查看并可以确认时间戳在 x 和 y 之间,y 为 x - 20 秒(以允许确认页面)。

参考的确认信息如下:

"Your transaction reference number is: 0 16123 #{timestamp} A1"

参考编号出现在句子的中间,所以我想大致如下:

expect('location-of-text').to have_text "Your transaction reference number is: 0 1612 {timestamp_range_here} A1"

我不确定是否可以做我需要的事情。

对解决方案的任何帮助都会很棒

【问题讨论】:

  • 获取确认信息并确保时间戳在特定范围内不是更容易吗?那么比如取Time.now,取走timestamp,如果结果小于等于20,大于0,就可以说是pass了?
  • 我也一直在尝试,但我一直在努力隔离字符串中的时间戳。
  • stackoverflow.com/questions/36572028/… 这是我与此问题相关的另一个问题,提到您的方法@kyle Fairns

标签: ruby cucumber capybara


【解决方案1】:

您可以找到您的元素、提取文本、解析时间戳并检查它是否在您的范围内。假设您的原始字符串看起来像这样"Your transaction reference number is: 0 16123 120000 A1",那么您可以执行以下操作:

text = find(element, text: /Your transaction reference number is: 0 16123 .* A1/).text
timestamp = text[/0 16123 (.*) A1/, 1]        #=> 120000
time = DateTime.strptime timestamp, '%H%M%S'  #=> Tue, 12 Apr 2016 12:00:00 +0000
expect(time).to be_between(Time.now - 20.seconds, Time.now)

【讨论】:

  • 我需要先给 (\d+) 分配一个变量吗?
  • @Tom 这取决于您的时间格式。例如:DateTime.parse 能够解析以下字符串 "Date is: 2016-04-12 16:16:17 +0300" 中的日期。您可以添加带有时间戳的字符串示例吗?
  • 字符串如下:“您的交易参考号是:0 16123 120000 A1”。 120000 是作为 HHMMSS 的时间戳。 0 16123和A1与日期无关
  • @Tom 您可以从文本中提取时间戳并使用DateTime.strptime 将其转换为日期。示例更新,看看
  • 维塔利,这太棒了。谢谢你。最后一个问题。开发人员将系统时间设置为落后 1 小时。我们如何将该时间设置为 - 从 Time.Now 开始的 1 小时?
【解决方案2】:

假设时间设置在服务器端的记录中,更简洁的解决方案是使用 Timecop gem 在特定时间冻结测试,从而修复应该在给定时间生成的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多