【问题标题】:Cucumber "puts" in After hook not outputting anything黄瓜“放入”后钩子不输出任何东西
【发布时间】:2012-05-10 02:47:02
【问题描述】:

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

例如,这是有效的:

Before do
  puts "before the scenario"
end

但这不是:

After do
  puts "after the scenario"
end

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

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

【问题讨论】:

  • 如果你想测试钩子是否运行,raise 可能比puts 更有效(当然更容易注意到)。
  • 谢谢,但正如我在问题中所说,我已经知道挂钩正在运行。我只是好奇为什么“puts”不会在 After 挂钩中输出任何内容。你(和其他人)也一样吗?还是只有我?
  • 好吧,看起来你并没有做错什么。如果您使用的是自定义格式化程序,您可能想尝试切换回默认设置,因为自定义格式化程序可能会抑制更多输出。
  • 尝试将其更改为STDERR.puts "after the scenario"——也许黄瓜对STDOUT 做了一些奇怪的事情?
  • 是的——Len,就是这样。那行得通。不过很奇怪。我在个人资料中使用“--format pretty”,这是你的意思吗,安德鲁?

标签: ruby cucumber


【解决方案1】:

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

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

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

总而言之,您没有做错任何事情,这就是 Cucumber 劫持puts 方法的方式。如果您对这些消息的格式不太在意,那么您可以将 puts 替换为 STDOUT.puts 以绕过 Cucumber 的格式。

【讨论】:

  • 有趣的是,puts"before the scenario" 会出现在输出之后 第一步,这让你认为Before 钩子在第一步之后运行步骤而不是任何方案步骤之前。使用STDOUT.puts 可以解决这个问题。
【解决方案2】:
 Before do
     p "Go!"
     puts "Go!"
 end

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

这个 sn-p 的输出可能有助于理解为什么 'puts' 在 After hook 中不起作用。

【讨论】:

  • 啊 - 好的,所以我稍微改变了它,然后运行它:Before do p "in before p" puts "in before puts" end After do p "in before p" puts "in before puts" end 我可以看到正在打印“p”,但只出现了“before puts”,并且它在执行第一步之后出现。
  • 抱歉,格式有点乱。所以这确实有点帮助——我可以使用“p”而不是“puts”,没想到这一点,但仍然很好奇为什么 After hook 中的“puts”不起作用。
  • $stdout 是一个保存标准输出流的全局变量。
  • 也感谢您的帮助,suvankar!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2017-04-17
相关资源
最近更新 更多