在RSpec中运行Ruby调试?


77

我试图让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。

谢谢,贾斯汀。


1
我最终使用了Pry,要容易得多/更好。插入Gemfile并安装后,将“ binding.pry”扔到规范中的任何位置,执行并滚动。有关详细信息,请参见屏幕。
异氰酸烯丙酯

Pry是一个很棒的对象浏览器,但是(即使使用pry-nav)它也没有调试器gem所具有的调试器功能。我希望这样做,但是我已经回到调试器。
Marnen Laibow-Koser 2012年

Answers:


72

通过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+并撬动。这几乎是相同的过程:

require 'spec_helper'
require 'pry-debugger'

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

另外,我通常在spec_helper文件中放入这样的需求,以便pry-debugger适用于所有规格。


这里需要注意:我的解决方案适用于将ruby调试添加到一个特定的spec文件,zetetic的解决方案可以调试整个项目。
Christopher Maujean

2
该解决方案对我不起作用。我得到:无法加载此类文件-ruby-debug(LoadError)
Felix Rabe

2
回复:以上。需要用ruby-debug19 gem取消注释Gemfile行。(实际上将其放入:test和:development组。)现在可以使用。
Felix Rabe

取决于用于调试的GEM。我使用"pry-rails""pry-byebug"所以我会的require 'pry-rails'。同样,在Gemfile中,它们需要包含在test environment
Fabrizio Bertoglio中

27

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

--debug

2
invalid option: --debug (defined in ./.rspec)
伊恩·沃恩

22

对于Ruby> = 1.9.2

您应该安装调试器gem而不是ruby-debug19。如果使用bundler,只需将其放入Gemfile中:

group :test do
  gem "debugger"
end

之后,您可以放

规格<3.0

--debug

rspec> = 3.0

-rdebugger

在你的 .rspec文件中

那你就可以跑

bundle exec rake spec

没有任何其他参数。有没有必要修改源代码是(甚至不是你的测试源代码)


3
+1,感谢您指出。无需进行任何代码修改即可启用调试器,但是您必须修改测试代码才能调用调试器,完全与原始问题(添加一条debugger语句)顶部所示的一样。另外,如果使用spork运行测试,则rdb提示将出现在spork控制台中,该控制台不会回显您键入的内容。似乎最容易在没有spork的情况下运行。
Mark Berry 2012年

4
如果使用byebug,则它变为-rbyebug
mcr

16

对于ruby 2.0,我使用byebug: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
由于某种原因,此解决方案不起作用。通过测试
2015年

@Trip很有趣,也许不是byebug尝试添加debugger
僵尸网络

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

在您的终端外壳程序中,以便在运行测试时观看日志记录语句。

当然,在实际的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
巨大的+1,这是一个非常伟大的小费
hoitomt

这没有回答问题。
phatmann

phatmann,这是Rails 3中允许登录rspec测试的最正确方法。将方法添加到spec_helper.rb文件后,您可以使用以下命令记录调试语句: logger.debug "#{1.class}" 如果需要,可以在调试语句前添加随机字符串,并将tail命令的输出传递给grep以过滤调试语句。
颂德

2
投票失败。OP询问的是调试器断点,而不是日志记录(无论如何,这不是规范中的最佳主意)。
Marnen Laibow-Koser 2012年

1
拒绝投票,原因与@ MarnenLaibow-Koser相同。可能是有用的信息,但不能回答OP的实际问题。
denishaskin 2013年

4

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

--color
--require pry
--require rails_helper

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

随意使用debuggerruby-debugpry(在你的Gemfile撬护栏)。

对于您的Gemfile:

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

require 'ruby-debug'etc等放在您的规范的顶部只是更加紧密地结合在一起-尤其是因为此处获得最高投票的评论建议将其单独放入您的所有文件中。使用新.rspec文件,您不再需要放在文件顶部require 'spec_helper'require 'rails_helper'顶部。

作为隐式命令行参数,它们更有意义。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.