Ruby 为什么我需要用Cucumber数据表初始化Cucumber数据表?
我们最近开始将一个非常旧的Rails应用程序拖到最新版本(或者至少已经过时)。其中一个变化是将Cucumber从1.3.x更新为2.99 这个应用程序上的许多rspec规范都使用了一个助手来加载测试数据,它利用了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
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
方法。)