Ruby 如何将一个步骤中的值转换为其他步骤中的值

Ruby 如何将一个步骤中的值转换为其他步骤中的值,ruby,cucumber,page-object-gem,Ruby,Cucumber,Page Object Gem,在我的场景中,第一步或第二步设置了我需要在其他步骤中使用的数据。步骤如下所示: Given I add 5 apples And I add 3 bananas 我需要保存每种水果的类型和数量,以便在以后的步骤中验证定价、小计、总计等一些内容。最初我使用实例变量,因为场景很简单。它们只包括一种水果类型和数量。然而,由于场景包括更多的水果类型和数量,我需要找出如何保存这些,以便在以后的步骤中使用。当我们在每个场景中只使用一种水果和数量时,我的步骤是: Given(/^I add (\d+) "(

在我的场景中,第一步或第二步设置了我需要在其他步骤中使用的数据。步骤如下所示:

Given I add 5 apples
And I add 3 bananas
我需要保存每种水果的类型和数量,以便在以后的步骤中验证定价、小计、总计等一些内容。最初我使用实例变量,因为场景很简单。它们只包括一种水果类型和数量。然而,由于场景包括更多的水果类型和数量,我需要找出如何保存这些,以便在以后的步骤中使用。当我们在每个场景中只使用一种水果和数量时,我的步骤是:

Given(/^I add (\d+) "([^\"]*)"$/) do |quantity, type|
  @fruit = {}
  @fruit = [type => quantity]
  #rest of code here
end

更改此项以使其继续工作的最佳方法是什么?

您可以将
@fruit
设置为哈希,其中键是水果类型,值是每个水果的数量。比如说,

@fruit = {:apples => 5, :bananas => 3}
代表5个苹果和3个香蕉

你可以很容易地用你的黄瓜步骤做到这一点。注意,为了清晰起见,我将
@fruit
重命名为
@basket

Given(/^I add (\d+) "([^\"]*)"$/) do |quantity, type|
  @basket ||= {}
  @basket[type] = quantity
  #rest of code here
end 
如果您想做一些添加更多相同水果类型的事情,例如:

Given I add 5 apples
And I add 3 apples
上述步骤只能保留最后的数量(篮子里只有3个苹果)。您可以将步骤更改为对数量求和,以便最终得到8个苹果:

Given(/^I add (\d+) "([^\"]*)"$/) do |quantity, type|
  add_fruit = {type => quantity}
  @basket ||= {}
  @basket = @basket.merge(add_fruit){ |key, oldval, newval|  oldval + newval }
  #rest of code here
end 

当然,您的其他代码需要进行调整,以考虑包含多种水果类型的散列。

如果您需要在测试中渗透这种粒度和特异性级别,您可能使用cucumber做了错误的事情。您建议使用哪种类型的工具?您能提供一个实际/实际的cucumber步骤吗地址。例如,您想让多少内容可供后续步骤使用?将
@fruit={}
替换为以下行:
@fruit | |={}
谢谢Justin。我能在模块或基本页中初始化@basket吗?还是必须在步骤中完成?是的,你可以。然而,我不确定这是否有意义或有益。谢谢贾斯汀。我会试试看。