Ruby 为什么我需要用Cucumber数据表初始化Cucumber数据表?

Ruby 为什么我需要用Cucumber数据表初始化Cucumber数据表?,ruby,cucumber,Ruby,Cucumber,我们最近开始将一个非常旧的Rails应用程序拖到最新版本(或者至少已经过时)。其中一个变化是将Cucumber从1.3.x更新为2.99 这个应用程序上的许多rspec规范都使用了一个助手来加载测试数据,它利用了Cucumber::Ast::DataTable。(helper声明了它自己的子类,该子类继承自cumber::Ast::DataTable)这是不推荐的,因此正如建议的那样,我将继承替换为cumber::MultilineArgument::DataTable 子类如下所示: clas

我们最近开始将一个非常旧的Rails应用程序拖到最新版本(或者至少已经过时)。其中一个变化是将Cucumber从1.3.x更新为2.99

这个应用程序上的许多rspec规范都使用了一个助手来加载测试数据,它利用了
Cucumber::Ast::DataTable
。(helper声明了它自己的子类,该子类继承自
cumber::Ast::DataTable
)这是不推荐的,因此正如建议的那样,我将继承替换为
cumber::MultilineArgument::DataTable

子类如下所示:

class ParsedTable < ::Cucumber::MultilineArgument::DataTable
  def initialize(string)
    super(string.split("\n").map do |line|
      line = line.split('|').map(&:squish)
      line.slice(1, line.length)
    end)
  end
end
create_roles <<-eos
  | Name      | Contracted workday in minutes |
  | Therapist | 390                           |
eos
这些助手的呼叫方式如下:

class ParsedTable < ::Cucumber::MultilineArgument::DataTable
  def initialize(string)
    super(string.split("\n").map do |line|
      line = line.split('|').map(&:squish)
      line.slice(1, line.length)
    end)
  end
end
create_roles <<-eos
  | Name      | Contracted workday in minutes |
  | Therapist | 390                           |
eos

Cucumber的API文档声明Cucumber::MultilineArgument::DataTable的构造函数采用
Core::Ast::DataTable
对象

资料来源:

您需要的是
Core::Ast::DataTable
的实例,而不是从字符串对其进行自定义解析

创建一个新实例+raw+应该是一个字符串数组或散列数组,您通常不会创建自己的DataTable对象-Cucumber将在内部创建,并将它们传递给步骤定义

资料来源:

cucumber似乎已经在步骤绑定中将该表解析为
Core::Ast::DataTable
对象,因此您需要做的就是将其传递给
ParsedTable
类的构造函数


如果这不可用,那么您需要提供一个字符串数组来代替。

Greg Burghardt的答案有正确的原因;Cucumber::MultilineArgument::DataTable类需要一个
Core::Ast::DataTable
作为参数,这对于旧的
Cucumber::Ast::DataTable
来说是不正确的。(这个类通常是Cucumber 1.4.x和当前版本之间的一个移动目标。)

最后我通过避免这个问题解决了这个问题。仔细查看使用自定义
ParsedTable
类的方法,我发现它们实际上并不依赖于类,而是依赖于对每个实例调用
hash
。我需要的是能够对
散列进行适当响应的东西


因此,我没有简单地将
Cucumber::MultilineArgument::DataTable
子类化以获得一个自定义构造函数,而是用一个方法替换了子类定义,该方法接受一个字符串,将其拆分为行,并将该
Array
行提供给
cucucumber::MultilineArgument::DataTable
。这返回了一个
Cucumber::MultilineArgument::DataTable
的实例,我可以调用该实例上的
hashes
。这很有效。

看起来您需要在调用
super
时传递一个
Core::Ast::DataTable
。也许这个类并不像你想象的那么不受欢迎?嗯,
Core::Ast::DataTable
显然与
Cucumber::Ast::DataTable
不一样。我发现
Cucumber::MultilineArgument::DataTable
需要一个
Core::Ast::DataTable
作为参数(而不是我一直传递的数组),并且它有一个class方法
from()
,该方法将获取一个数组并返回
DataTable
的某种风格。我正试图用
cumber::MultilineArgument::DataTable#from
的输出初始化
ParsedTable
,但它还没有真正发挥好。这是合理的,但诀窍在于它不是在cumber步骤中发生的-它是为rspec设置测试数据的助手方法,而表是以字符串形式出现的。(请参阅上面我的第三段代码中的
create_roles
方法。)