2012-04-19 29 views
2

我试图运行一个场景几(30)次,以获得一个很好的统计样本。但是该块只能执行一次;随后的每个时间都会导致该方案被调用并且不会执行(尽管它表示该方案的成功完成时间约为5毫秒)。胡萝卜周围的黄瓜调用块多次(Ruby)

Around('@mass_benchmark') do |scenario, block| 
    $seconds_taken = "SECONDS TAKEN NOT SET" 
    @time_array = [] 
    30.times do 
    before_hook(scenario) 
    block.call 
    after_hook(scenario) 
    @time_array << $seconds_taken 
    end 
    write_time_array_to_file(@time_array, scenario_name) 
end 

标签@mass_benchmark执行该块,而不是〜@ mass_benchmark,刚刚正常执行的情况。 before_hook和after_hook方法复制Before('〜@ mass_benchmark')和After('〜@ mass_benchmark')钩子(实际上只是调用相同的方法)。

变量$ seconds_taken设置在我正在计时的特定区域周围。我不是在整个测试的时间,只是其中的关键部分;测试的其余部分已经到了这一点,等等,这不是定时部分的一部分,所以我不能将定时部分移动到这之外。

这个问题可能与我在这些方法中所做的事情有关,但据我所知,一切正常(正如放置的语句所示)。任何想法表示赞赏!

+0

我认为你可以使用'yield',而不是'block.call'。它也更高效。 – 2012-04-19 21:00:31

+0

投入产量会导致它返回“空测试套件”,即使它不是。这可能是因为block.call是另一个块内 – 2012-04-19 21:08:36

+0

你有一个IDE你可以用它来放断点?我最好的猜测是,在测试之后,你可能没有重新设置一些值,导致你的测试在每次后续运行中都没有任何事情要做。 – 2012-04-20 20:21:20

回答

3

目前黄瓜似乎并不支持在挂钩时两次调用该块。

Feature: This scenario will print a line 

    Scenario: Print a line 
    When I print a line 

和步骤定义:这可以通过以下特征文件证明

Around do |scenario, block| 
    Kernel.puts "START AROUND, status=#{scenario.status}" 
    block.call 
    Kernel.puts "BETWEEN CALLS, status=#{scenario.status}" 
    block.call 
    Kernel.puts "END AROUND, status=#{scenario.status}" 
end 

When /^I print a line$/ do 
    Kernel.puts "IN THE STEP DEFINITION" 
end 

当此执行,黄瓜会打印:

Scenario: Print line # features/test1.feature:3 
START AROUND, status=skipped 
IN THE STEP DEFINITION 
    When I print a line # features/test.rb:9 
BETWEEN CALLS, status=passed 
    When I print a line # features/test.rb:9 
END AROUND, status=passed 

以来的状态显然场景已经“通过”,但Cucumber不会重新执行它,尽管输出格式化程序会接收这些步骤。我还没有找到任何方法来“重置”场景API中的状态以使它们重新运行。

围绕钩子还有其他问题,例如你不能在围绕钩子设置变量(比如你可以在钩子之前)。更多血淋淋的细节,请参阅黄瓜问题52116