ChatGPT解决这个技术问题 Extra ChatGPT

如何让 rspec-2 提供与测试失败相关的完整跟踪?

现在,如果我使用 rake spec 运行我的测试套件,我会收到一个错误:

1) SegmentsController GET 'index' should work
   Failure/Error: get 'index'
   undefined method `locale' for #
   # ./spec/controllers/segments_controller_spec.rb:14:
      in `block (3 levels) in '

这是正常的,因为我确实有错误:)

问题是跟踪不是很有帮助。我知道它在 segments_controller_spec.rb 的第 14 行中断了,但这正是我称之为测试的地方:

### segments_controller_spec.rb:14
get 'index'

我希望有实际的换行和完整的跟踪,而不是规范文件夹中的部分。

--trace 一起运行没有帮助。

检查 spin.atomicobject.com/2010/12/28/rspec-backtrace-filtering 有一种方法可以更改默认的 RSpec 回溯过滤

D
Dorian

您必须使用 -b 选项运行 rspec 才能查看完整的回溯


我不明白,无论是这个还是接受的答案都没有让你从你的规范文件中进一步回溯。或者它不仅对我有用o_O
fwiw 如果您将 rspec 与 spork 和 guard 一起使用,您可以创建一个 .rspec 文件并在其中添加 -b 以在运行测试套件时获取输出
这确实是正确的答案——几乎所有时候你都不需要完整的回溯(包括诸如 rails 和 rspec 以及其他 gem 之类的东西)——你唯一需要它的时候是调试或理解由 gem 引起的东西本身。因此,请坚持使用默认的回溯清理模式,并在需要时在奇怪的情况下使用 -b。
它没有显示有关错误本身的堆栈跟踪信息。相反,它显示了 rspec gem 的堆栈跟踪
也适用于 RSpec 3
n
nathanvda

另一种(更简单的)替代方法是编辑 .rspec 文件,并添加 backtrace 选项。它应该看起来像这样:

--colour
--backtrace

这将为您提供完整的回溯。希望这可以帮助。


是的!这正是我所需要的。堆栈跟踪到实际错误而不是规范堆栈。
我认为合适的拼写是 color。我想如果你拼写它 colour 可能会出现一个 Monty Python 笑话
如果您来自美国,则合适。在英国,他们写颜色,而 rspec 的人非常友好地允许两者;)
那是把扳手扔进引擎盖了!
M
Maria V

这也将起作用:

# rails_helper.rb
RSpec.configure do |config|
  config.full_backtrace = true
end

N
Nowaker

另一种方法是清除 spec_helper.rb 中的所有回溯排除模式。我最喜欢这个解决方案,因为我能够将所有 RSpec 设置保存在一个地方,并在 .travis.yml 中去掉 .rspec file 或显式 --backtrace

# spec_helper.rb
RSpec.configure do |config|
  config.backtrace_exclusion_patterns = []
end

rspec 2.x 中似乎没有该选项。
B
Benjamin Atkin

我不知道如何让控制器错误显示在 rspec 中。有时它会出现,但我不知道是什么条件导致它出现。不过,这是一种相当快速地查看错误的方法:

打开另一个终端会话并运行:

tail -f log/test.log

然后返回终端会话并仅运行出现错误的规范:

bin/rspec -b spec/requests/posts/index_spec.rb

回到日志的尾部,您应该会看到错误,希望它周围没有太多其他内容(因为您自己运行了失败的测试)。


M
Michael Yagudaev

当所有其他方法都失败时,另一种选择是添加一个救援块并打印出堆栈尝试或在那里添加一个绑定 pry 语句并使用 show-stack

rescue Exception => e
  puts ""
  puts e.backtrace
  puts ""

这有时是最好的选择。只要确保在它开始工作后将其删除。它应该包含您期望错误所在的位置。也许将 beginrescue 块作为控制器操作方法的外部语句。或使用 rescue_from
@bat 是的,这是最后的尝试,就像@bat 所说,一旦你弄清楚了就需要删除它。永远记得在提交之前做你的git diff,这会节省你的培根。