在rspec中运行ruby调试?

时间:2011-03-27 01:28:55

标签: ruby-on-rails rspec rake ruby-debug

我正在尝试让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。

谢谢, 贾斯汀。

6 个答案:

答案 0 :(得分:68)

您可以通过在规范的顶部添加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

另外,我通常在spec_helper文件中提出这样的要求,以便pry-debugger可用于我的所有规范。

答案 1 :(得分:28)

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

--debug

答案 2 :(得分: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 :(得分: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

答案 4 :(得分: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
在终端shell中

,以便在运行测试时观察日志记录语句。

当然,在您的实际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打开一个统治世界的交互式调试器控制台!

答案 5 :(得分:4)

最好也是最干净的选择是在--require文件中使用.rspec。你放的东西取决于你用来调试的宝石。

--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'放在文件的顶部。

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