【问题标题】:How to capture the value of an abort or exit with Rspec如何使用 Rspec 捕获中止或退出的值
【发布时间】:2015-12-30 04:19:28
【问题描述】:

我正在尝试为我的脚本编写一个 Rspec 测试,如果我的脚本正常失败,该测试将通过。

if options[:file] == false
  abort 'Missing an argument'
end

Rspec:

it 'if the file argument is not given, it provides a helpful message' do
  expect(`ruby example_file.rb`).to eq('Missing an argument')
end

我的测试继续失败并说

expected: 'Missing an argument'
got: ''

我不知道为什么它返回一个空字符串。我看了这些帖子没有运气:

如果您需要有关我的脚本的更多信息,请告诉我。谢谢你。

【问题讨论】:

  • 您通常不希望通过使用反引号从命令行运行脚本来使用 RSpec 来测试脚本。当你这样做时,你失去了用你想要的控制级别测试事物所需的上下文。您将执行交给 shell(Bash、Cmd 等),然后等待它返回一个值或将一些文本输出到 stdout 或 stderr

标签: ruby shell rspec


【解决方案1】:

abort/exit 都将打印到stderr,而您的 rspec 正在侦听stdout 频道。请尝试以下操作:

expect(`ruby example_file.rb`).to output('Missing an argument').to_stderr

【讨论】:

  • 现在看来 RSpec requires block syntax for the output matcher (例如 expect { `ruby example_file.rb` }.to ...)
  • 这本身并不能阻止您的源代码中遇到的 abortexit 1 导致 rspec 本身 过早中止,如果您'重新使用 ruby​​ 作为 shell 脚本语言。事实上,rspec 仍会打印其最终摘要消息,甚至可能不会警告您任何规范“失败”。 (但是,您的 shell 捕获的 $? 值仍将是非零值。)在我们将控制台脚本添加到带有相应 rspec 测试的 Rails 应用程序并且没有立即捕获退出案例后,我们遇到了这个问题——我们的套件会在随机数量的示例后退出。
  • 这个other StackOverflow answer 帮了我大忙。
猜你喜欢
  • 2014-12-18
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多