在rspec中运行ruby debug?

86

我试图在我的一个测试中运行 Ruby 调试器:

describe User do
  it "should be valid" do
    debugger
    User.new.should be_valid
  end
end

然而,当我运行rspec时,我得到以下结果:

debugger statement ignored, use -d or --debug option to enable debugging

我尝试了以下方法:

rake spec --debug
rake spec --debug  --trace
rake spec:models --debug
bundle exec rspec --debug
bundle exec rspec --debug spec/models/
bundle exec rspec --d spec/models/
bundle exec "rspec --debug" spec/models/
bundle exec rspec --debugger spec/models/
bundle exec --debugger rspec spec/models/
bundle --debugger exec rspec spec/models/
bundle --debugger exec rspec spec/models/
bundle exec --debugger rspec spec/models/
bundle exec rspec --debugger spec/models/

有关如何正确执行rspec的任何想法?我使用的是Rails 3.0.5、Ruby 1.9.2、RSpec 2.5.1和ruby-debug19。

谢谢, Justin。


1
我最终使用了Pry,它更加容易和好用。在将其插入Gemfile并安装后,在你的spec中任何地方添加"binding.pry",执行即可。详见屏幕录像。 - Allyl Isocyanate
Pry是一个很好的对象浏览器,但即使使用了pry-nav,它也没有像debugger gem那样的调试器功能。我希望它有,但我已经回到了debugger。 - Marnen Laibow-Koser
6个回答

77

如果在您的spec文件顶部包含require 'ruby-debug',您将得到您想要的结果:

# spec/models/user_spec.rb
require 'spec_helper'
require 'ruby-debug'

describe User do
  it "should be valid" do
    debugger
    User.new.should be_valid
  end
end

您随后可以像平常一样运行 rake specrspec

注意: 我现在更喜欢Ruby 2.0+和pry。 这个过程基本上是相同的:

require 'spec_helper'
require 'pry-debugger'

describe User do
  it "should be valid" do
    binding.pry
    expect(User.new).to be_valid
  end
end

另外,我通常会将类似这样的require语句放在我的spec_helper文件中,以便在所有的测试用例中都能使用pry-debugger。


这里需要注意的是:我的解决方案适用于将 Ruby 调试添加到一个特定的规范文件中,zetetic 的解决方案可以为整个项目启用调试。 - Christopher Maujean
2
解决方案对我不起作用。我得到了:无法加载文件--ruby-debug(LoadError) - Felix Rabe
2
回复:以上内容。需要取消注释Gemfile中带有ruby-debug19 gem的行。(实际上将其放入:test、:development组中。)现在可以工作了。 - Felix Rabe
取决于您用于调试的 GEM。我使用“pry-rails”和“pry-byebug”,因此我会 require 'pry-rails'。同时,在 Gemfile 中它们需要被包含在 test environment 中。 - Fabrizio Bertoglio

27
你可以在项目的根目录中创建一个.rspec配置文件,并包含以下行:
--debug

4
无效选项:--debug(定义于./.rspec中)。 - Ian Vaughan

22

对于 Ruby >= 1.9.2

你应该安装 debugger gem,而不是 ruby-debug19。如果你使用 bundler,则只需在 Gemfile 中添加以下内容:

group :test do
  gem "debugger"
end

之后你只需放置

rspec < 3.0

--debug

rspec >= 3.0

-rdebugger

在你的.rspec文件中

然后你只需要运行

bundle exec rake spec

不需要任何额外的参数。而且无需修改您的源代码(甚至不需要修改测试源代码)。


3
+1并感谢你指出这一点。并没有修改代码来启用调试器,但你需要修改你的测试代码以调用调试器,就像原问题顶部所示(添加一个debugger语句)。另外,如果你使用spork运行测试,rdb提示将出现在spork控制台中,该控制台不会回显你输入的内容。似乎最好不要使用spork来运行测试。 - Mark Berry
4
如果您使用byebug,那么它就变成了-rbyebug。 - mcr

20

我使用byebug来调试Ruby 2.0:https://github.com/deivid-rodriguez/byebug

gem 'byebug'

代码:

# spec/models/user_spec.rb
require 'spec_helper'
require 'byebug'

describe User do
  it "should be valid" do
    byebug
    User.new.should be_valid
  end
end

1
由于某些原因,这个解决方案不起作用。测试未通过。 - Trip
1
@Trip 这很有趣,也许你可以尝试添加 debugger 而不是 byebug - BotNet

9
我发现在 rSpec 中进行调试的最佳方式是在 'spec_helper.rb' 文件中添加以下内容。
def logger
  Rails.logger
end

您可以在rSpec文件中访问所有记录器方法,并包含诸如标记日志等内容。当然,这适用于Rails 3及以上版本。如果您使用的是Rails 3之前的版本,请改为添加以下内容:

def logger
  RAILS_DEFAULT_LOGGER
end

一旦您已经记录了相关声明,您可以输入

tail -f log/test.log

在运行测试时,您可以在终端中输入以下命令以查看日志记录语句:
``` tail -f log/test.log ```
当然,在实际的rspec测试中,您需要输入类似以下的内容:
logger.debug "#{1.class}"  # => Fixnum

如果你想要从测试日志中过滤掉调试语句,只需在调试语句前面添加一个随机字符串,并将tail命令的输出导入grep。

例如:

logger.debug "random_string #{1.class}"   # => Fixnum

tail -f log/test.log | grep random_string

更新

我改变了我的看法。你应该安装pry、pry-doc、pry-debug、pry-debugger和pry-rails。然后在你的代码中使用binding.pry打开一个交互式调试器控制台,它可以统治世界!


1
非常赞同,这是一个非常好的技巧。 - hoitomt
这并没有回答问题。 - phatmann
phatmann,这是在Rails 3中允许在rspec测试中记录日志的最正确方法。一旦您将该方法添加到spec_helper.rb文件中,您就可以通过使用logger.debug "#{1.class}"记录调试语句。如果您希望,在调试语句前可以添加一个随机字符串,并将tail命令的输出管道传输给grep以过滤调试语句。 - Ode
2
踩负评。OP 询问的是调试器断点,而不是日志记录(在规范中也不是最好的想法)。 - Marnen Laibow-Koser
1
下降投票,原因与@MarnenLaibow-Koser相同。这可能是有用的信息,但并没有回答OP实际的问题。 - denishaskin

4

最好和最干净的选项是在您的.rspec文件中使用--require。您放置的内容取决于您用于调试的gem。

--color
--require pry
--require rails_helper

这些对应于命令行选项(-d或--debug现已弃用)。

可以随意使用debuggerruby-debugpry(在您的Gemfile中使用pry-rails)。

对于您的Gemfile:

group :test, :development do
  gem 'pry-rails'
end

在你的规范文件的顶部放置require 'ruby-debug'等内容,会让它们之间的耦合更紧密 - 尤其是因为最高票的评论建议在所有文件中单独设置。使用新的.rspec文件后,你就不需要再把require 'spec_helper'或者require 'rails_helper'放在文件的顶部了。它们作为隐含的命令行参数更加合理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接