Ruby 替换小黄瓜参数字符串

Ruby 替换小黄瓜参数字符串,ruby,cucumber,capybara,gherkin,Ruby,Cucumber,Capybara,Gherkin,有没有办法替换传递给相应步骤定义的小黄瓜参数的文本 例如,假设我有以下带有匹配变换的小黄瓜步骤: Given I select "any option" from the "Choose an option" dropdown DROPDOWN_OPTION = Transform /^any option$/ do |str| str = all("li", :minimum => 1).sample.text end 如果选择的li是设置,我希望执行该步骤后的结果如下所示: G

有没有办法替换传递给相应步骤定义的小黄瓜参数的文本

例如,假设我有以下带有匹配变换的小黄瓜步骤:

Given I select "any option" from the "Choose an option" dropdown

DROPDOWN_OPTION = Transform /^any option$/ do |str|
  str = all("li", :minimum => 1).sample.text
end
如果选择的li是设置,我希望执行该步骤后的结果如下所示:

Given I select "settings" from the "Choose an option" dropdown
我意识到这不是编写小黄瓜的理想方法,甚至不是一般的测试方法,但不幸的是,这是我一直坚持的一个限制


有人能提供建议吗?

尽管cucumber不关心关键字的顺序,但惯例是根据以下内容编写步骤:

Given the context
When action
Then expectation 
因此,为了改变你的情况,我会写:

Given I have options
When I choose "whatever" dropdown
Then I expect ...

这就是你要问的吗

/功能/步骤定义/下拉菜单\u steps.rb

Given /^I select (\w+) from the Choose an option dropdown$/ do |opt|
  #do what ever you need to here with opt
  instance_variable_set("@option_selected",DropDownOption.new(opt))
end
When /^I make it go$/ do
  #make it go
  @option_selected.go
end
Then /^I expect that it went$/ do 
  #test that it went with the opt selected
  @option_selected.went?
end
Then /^I expect it is still (\w+)$/ do |opt|
  @option_selected.selected == opt
end
/功能/下拉选项。功能

Feature: DropDownOption
  This is to test that I can send a DropDownOption away
  but it will still be itself

  Scenario: Selected Stuff
    Given I select stuff from the Choose an option dropdown
    When I make it go
    Then I expect that it went
    Then I expect it is still stuff
这样做的目的是将每个匹配组传递到下面的块中,允许您设置实例变量之类的内容并对其执行操作。因此,在我的第一步中,它创建了一个名为@option_的实例变量,该变量是从stuff regex匹配中选择的。第二步告诉这个实例变量go,第三步确保它go?。最后,第四步确保即使它消失了,它仍然是相同的选择

这显然是一个非常通用的示例,只是为了说明特性和步骤定义是如何工作的。它假设了很多东西,但基本上它可以与这样的类一起工作

class DropDownOption
  def initialize(opt)
    @opt = opt
    @is_here = true
  end
  def go
    @is_here = false
  end
  def selected
    @opt
  end
  def is_here?
    @is_here
  end
  def went?
    !is_here?
  end
end
更新

如果要转换某个对象,则它必须充当捕获组

Feature: RandomString
  Scenario: With a Random String
    Given I type "random string" into the title field
    Then I want it to be a String

Transform /^I type ? "(.*)"$/ do |str|
  rand(36**15).to_s(36)
end
Given /^(I type "(?:.*)") into the title field$/ do |str|
  instance_variable_set("@random_string",str)
end
Then /^I want it to be a String$/ do
  puts @random_string
  expect(@random_string).to be_kind_of(String)
end
输出

Feature: RandomString

  Scenario: With a Random String                     # features\random_string.feature:2
    Given I type "random string" into the title field # features/step_definitions/random_steps.rb:4
    Then I want it to be a String                    # features/step_definitions/random_steps.rb:7
    qxv75si91k2u10s  #this is the transformed string it is random but will not alter the feature step definition
当捕获组与转换器匹配时,将进行转换,这将通过管道代替原始捕获


特征定义是为了测试目的而固定的。它们的用字要简单明了,由媒人处理。它们并不意味着要动态实现,因为这会偏离它们的真正目的。

与其重写你的源代码,不如说你的主要目标是操纵你的结果,而不是你的输入。如果这是您的目标,只需创建一个。通过覆盖AfterStep,您可以将值插入到结果中,并传达您需要的信息。

我不太清楚,因为cucumber就是这样工作的。始终使用正则表达式,因为它们的真正意图是允许这种行为。也许这对我不起作用?我最初把这个集合作为一个变换。类似于:DROPDOWN_OPTION=Transform/^any OPTION$/do | str | str=allli,:minimum=>1.sample end但执行此步骤时,结果仍然显示为:给定我从选择选项下拉列表中选择任何选项,而不是:给定我从选择选项下拉列表中选择所选选项实际上,这是我们最初的方法。我让团队就这样写小黄瓜——但不幸的是,这种方法不利于我们组织内部的结构。手动测试人员,而不是开发人员,甚至是自动化团队,是这些自动化测试的最终受益者,因此必须重写小黄瓜,使其更具可追踪性和特异性。这与我的要求不完全一样,可悲的是,我其实很喜欢你在这里所做的一切,我有几个方面想把这些应用到你身上;简直是浪费时间。不过,我只是把我的问题重新组织了一下,使之更加具体。我要问的是,如果小黄瓜是:假设我有一个随机字符串,如果我有dj342,我怎么能把它打印出来^&e6he@3在结果中?例如,我如何用不同的字符串替换小黄瓜参数。@DavidAdams我想我现在理解了你的概念,但是你想把它转换成什么?通常转换成另一个字符串,真的。当测试失败时,手动团队将检查生成的报告,并尝试追溯执行的特定步骤。我们的小黄瓜文件可能会读取给定的I在title字段中键入的随机字符串,但在结果中,我们希望它们看到给定的I类型dj342^&e6he@3输入标题字段,以便他们知道插入的确切信息。几乎所有这些替换都是从一个字符串到另一个字符串的,只是提供了有关所执行操作的更具体信息。有意义吗?@davidams有意义,我只是不确定这是否可能,因为匹配发生在转换之前。转换是为了处理匹配,而不是改变匹配本身。我已经添加了一个示例来向您展示。很好,我甚至不知道这些。我通常只使用RSpec,但我会看看这些都是关于什么的。呃,它们使它看起来比实际看起来容易得多。这是非常棒的,尽管感谢您的发布,因为我不知道有多少回电话可用