Cucumber 有没有办法检查哪种场景称为特定步骤?

Cucumber 有没有办法检查哪种场景称为特定步骤?,cucumber,capybara,Cucumber,Capybara,我在两个不同的功能文件中有两个场景,但这两个场景都测试了搜索功能,但都位于页面的不同部分。 我看到的场景如下所示: Scenario Outline: Search items from QuickSearch Given that the following items | id | title | | 1 | Item1 | | 2 | Item2 | When I search for <criteria> in this

我在两个不同的功能文件中有两个场景,但这两个场景都测试了搜索功能,但都位于页面的不同部分。 我看到的场景如下所示:

Scenario Outline: Search items from QuickSearch
Given that the following items
  | id | title       | 
  | 1  | Item1       | 
  | 2  | Item2       |
When I search for <criteria> in this search
Then I should get <result>
And I should not get <excluded>

Examples:
|criteria|result    | excluded  |
| 1      | 1        | 2         |
| 2      | 2        | 1         |
场景大纲:从QuickSearch搜索项目
鉴于以下各项
|id |标题|
|1 |项目1 |
|2 |项目2|
当我在此搜索中搜索时
那我应该去
我不应该
示例:
|标准|结果|排除|
| 1      | 1        | 2         |
| 2      | 2        | 1         |
以及:

场景大纲:使用过滤器
鉴于我有以下几点:
|id |名称|
|1 |事情1|
|2 |事情2|
当我使用充满
那么我应该得到这些
我不应该得到这些
示例:
|筛选|标准|结果|排除|
|名称|事物| 1,2 ||
|id | 1 | 1 | 2|
正如您在第二个场景中所看到的,为了为这两个场景编写单独的步骤,我更改了get to get这个词。 我需要两个不同步骤的唯一原因是,两个不同场景中的id映射到不同的名称(不,我不能同时使用相同的名称,也不想在第二个场景中从id 3开始)

因此,我正在考虑这两种场景的通用步骤(至少在涉及then步骤时是这样),我希望哈希映射id和名称一起进行验证,但我希望哈希根据称为步骤的场景而有所不同


那么,cucumber+capybara中有没有一种方法可以告诉我哪种场景称为步骤?

我不知道有什么方法可以直接从cucumber步骤访问场景名称。但是,您可以访问before钩子中的名称并将其存储在变量中,以便步骤可以使用该名称

将此前钩子添加到您的
env.rb

Before do |scenario|
    case scenario
        when Cucumber::Ast::OutlineTable::ExampleRow
            @scenario_name = scenario.scenario_outline.name
        when Cucumber::Ast::Scenario
            @scenario_name = scenario.name
        else
            raise('Unhandled scenario class')
    end
end
编辑:如果您使用的是Cucumber的最新版本,请尝试:

Before do |scenario|
  case scenario.source.last
  when Cucumber::Core::Ast::ExamplesTable::Row
    @scenario_name = scenario.scenario_outline.name
  when Cucumber::Core::Ast::Scenario
    @scenario_name = scenario.name
  else
    raise('Unhandled scenario class')
  end
end
然后,您的步骤可以使用
@scenario\u name
检查场景名称。例如:

Then /I should get (.*)/ do |result|
  if @scenario_name == 'Search items from QuickSearch'
    # Do scenario specific stuff
  elsif @scenario_name == 'Using a filter'
    # Do scenario specific stuff
  end

  # Do any scenario stuff
end

值得注意的是Tyvm,希望它已经以某种方式实现了,但我可以使用它!
Then /I should get (.*)/ do |result|
  if @scenario_name == 'Search items from QuickSearch'
    # Do scenario specific stuff
  elsif @scenario_name == 'Using a filter'
    # Do scenario specific stuff
  end

  # Do any scenario stuff
end