我正在为Cucumber的AfterStep
回调编写一个方法。
https://github.com/cucumber/cucumber/wiki/Hooks#step-hooks
如何确定在调用此挂钩之前执行了哪个步骤?
答案 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)
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