17

在 Cucumber 中,在我的env.rb文件中,我设置了一个 before & after 挂钩(嗯,其中一些,一些链接到特定标签)但是发现当我在其中放入后挂钩时不会输出任何内容puts

例如,这有效:

Before do
  puts "before the scenario"
end

但这不是:

After do
  puts "after the scenario"
end

似乎 after 钩子确实运行了(因为在 after 钩子中有一个特定的行有问题,在尝试调试它时,我发现了这个问题)但它们只是没有输出任何东西。

我所有的搜索都证明是徒劳的,找不到其他有类似问题的人。谁能告诉我我做错了什么?

4

2 回答 2

24

Cucumber 会覆盖类puts中的消息,RbWorld以便使用编写的任何内容都puts可以正确地广播到所有格式化程序。在pretty格式化程序的情况下,它们进入一个delayed_messages集合,直到它调用print_messages,它似乎在打印每个步骤名称之后执行,大概是这样消息似乎嵌套在生成它们的步骤下。

由于某种原因,漂亮的格式化程序中没有最终调用print_messages,我不确定这是遗漏还是故意的,因为在输出中包含虚假消息看起来不那么“漂亮”。

有趣的是,如果您添加第二个场景,当第二个场景运行时,您会看到“在场景之后”打印为第一条消息,这就是正在运行的delayed_messages集合。

综上所述,你没有做错,只是 Cucumber 劫持了puts方法。如果您对这些消息的格式不太在意,那么您可以替换putsSTDOUT.puts绕过 Cucumber 的格式。

于 2012-05-10T10:50:24.180 回答
6
 Before do
     p "Go!"
     puts "Go!"
 end

 After do
     p "Stop!"
     puts "Stop!"
     $stdout.puts "Stop!"
 end

此代码段的输出可能有助于理解为什么 'puts' 在 After hook 中不起作用。

于 2012-05-10T05:40:08.293 回答