【问题标题】:Dynamic data in Cucumber tablesCucumber 表中的动态数据
【发布时间】:2018-06-27 21:22:32
【问题描述】:

我有一个Cucumber 表,其中一个字段是我想用今天的日期填充的日期。 有没有办法做到这一点,而不必将今天的日期硬编码到表中?

基本上我想在表格中输入Time.now.strftime("%Y-%m-%d") 而不让它中断。

【问题讨论】:

  • 注意:是的,我知道如何点击标签。我装傻是为了展示以下内容的重要性:正确的大小写、在问题中提供上下文、正确的标记......
  • 通过 Google 快速搜索表明 BDD 和 Cucumber 与 Ruby on Rails 相关 - 如果您在这些圈子中移动,这可能是显而易见的,但如果您不这样做,则不是。
  • Cucumber 实际上与 ruby​​ 相关,而不是 RoR。非 Rails 开发人员使用它来测试他们的代码。我用它来测试 Java 代码。而且BDD跟Rails没有关系,是Behavioral Driven Development,和TDD不同的风格,Test Driven Development。

标签: cucumber bdd


【解决方案1】:

由于您的步骤定义正在处理表格,您可以在表格中放置一个特殊的占位符,例如字符串“TODAYS_DATE”,然后使用map_column!将列中的数据处理为您的格式想要。

例如给出下表

Given the following user records
  | username | date        |
  | alice    | 2001-01-01  |
  | bob      | TODAYS_DATE |

在您的步骤定义中,您将拥有

Given /^the following user records$/ do |table|
  table.map_column!('date') do |date| 
    if date == 'TODAYS_DATE'
      date = Time.now.strftime("%Y-%m-%d")
    end
    date
  end
  table.hashes.each do |hash|
    #Whatever you need to do
  end
end

请注意,这只会在您请求哈希时更改值。 table 和 table.raw 将保持不变,但当您需要行哈希时,它们将由 map_column 中的代码转换!

【讨论】:

  • 完美,正是我想要的。谢谢。
【解决方案2】:

我知道这个问题被问到已经很久了,但我最近对 ​​Cucumber 做了类似的事情,所以如果有人感兴趣,这里有一个替代解决方案......

Given the following user records
 | username | date                             |
 | bob      | Time.now.strftime("%Y-%m-%d")    |

然后在您的步骤定义中只需 eval() 日期字符串

Given /^the following user records$/ do |table|
  table.hashes.each do |hash|
    date = eval(hash["date"])
  end
end

虽然与 Brandon 的示例不同,这不会让您在没有进一步逻辑的情况下输入确切的日期。

【讨论】:

  • 不应该是 hash["date"] = eval(hash["date"]) 吗?它对我来说是这样的
  • 不幸的是,这不适用于 OP 给出的包含条目 '2001-01-01' 的情况——这相当于 1999,因为它只是简单的整数运算。您必须将 Date.parse('2001-01-01') 之类的内容放入表中才能获得一般结果。
【解决方案3】:

bodnarbm 的答案非常好,如果这是您想要做的。我自己的建议是看看timecop gem。使用它将时间设置为已知日期,然后相应地调整您的表格。

【讨论】:

  • 很酷的 gem,我绝对可以在我当前的代码项目中想到它的一些用途。
【解决方案4】:

基于我创建的夹具文件:

特点:

Given the following "Inquirers":
  | id | email                    | start_date        |
  |  1 | alberto@deco.proteste.pt | <%= Time.now %>   |

助手:

Given(/^the following "(.*?)":$/) do |model, table|
  table.hashes.each do |hash|
    attributes = Rack::Utils.parse_nested_query(hash.to_query)
    object     = model_name.classify.constantize.new

    attributes.keys.each do |key|
      object.send("#{key}=", ERB.new(value).result())
    end
    ...
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2015-06-09
    相关资源
    最近更新 更多