我怎样才能知道我刚刚在Cucumber AfterStep钩子中执行了哪一步?

时间:2014-01-03 21:19:04

标签: ruby cucumber

我正在为Cucumber的AfterStep回调编写一个方法。

https://github.com/cucumber/cucumber/wiki/Hooks#step-hooks

如何确定在调用此挂钩之前执行了哪个步骤?

7 个答案:

答案 0 :(得分:3)

使用gem cucumber 2.1.0和场景轮廓,“Afterstep”中的场景对象只是一个测试结果状态,它不包含步骤的名称。我不得不使用包含测试列表的“Before”(在第一步之前调用)。

require 'logger'

$logger = Logger.new(STDOUT)

Before do |scenario|   

    @count = 0       
    @tests = Array.new

    scenario.test_steps.each{|r|
         if( r.name != "AfterStep hook")
              @tests << r
         end
     }
 end

 AfterStep do |scenario|  # run after each step

     $logger.info(@tests[@count].name.green)
     @count += 1;

 end

记录器是必需的,因为“puts”仅在场景大纲结束时显示。

答案 1 :(得分:1)

AfterStep挂钩仅接收方案作为参数。

你可以做的是计算步数,然后得到当前的步骤:

AfterStep do |scenario|
  @step ||= 0
  p scenario.steps[@step].name
  @step += 1
end

这将依次打印每个参数的名称

答案 2 :(得分:1)

注意:

api略有变化。你现在需要使用&#39; to_a&#39;

即。 Alex Siri的上述行将更改为:

  p scenario.steps.to_a[@step].name

答案 3 :(得分:1)

Vince有一个很好的解决方案,我会推荐一个重构:

Before do |scenario|
    @tests = scenario.test_steps.map(&:name).delete_if { |name| name == 'AfterStep hook' }
end

您可以使用@ tests.count而不是@count变量

我会把它作为评论,但我还没有足够的声誉。

答案 4 :(得分:0)

我按照以下方式解决了这个问题:

Before do |scenario|
    ...
    @scenario = scenario
    @step_count = 0
    ...
  end

  AfterStep do |step|
    @step_count += 1
  end

保持步骤编号的更新。为了获得步骤名称:

@scenario.test_steps[@step_count].name

答案 5 :(得分:0)

文斯的答案很棒!和SMAG的重构很酷!但是当我在我的黄瓜测试项目上应用解决方案时,我收到了一个错误:

 undefined method `name' for #<Cucumber::Core::Test::Step:>

所以,答案可能会更新如下:

Before do |scenario|
    @tests = scenario.test_steps.map(&:text).delete_if { |text| text == 'AfterStep hook' }
end

答案 6 :(得分:0)

API已更改...基于afterhook doc,您可以获得result (黄瓜::核心::测试::结果)和{{ 3}} (黄瓜::核心::测试::步骤)

AfterStep do |result, test_step|
  #do something
end

您可以通过以下方式获取步骤名称:

stepName = test_step.text

stepName = test_step.to_s