在 Rspec 中运行 Ruby 调试?

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

对如何正确执行规格有什么想法吗?我在使用 Rails 3.0.5,Ruby 1.9.2,RSpec 2.5.1,Ruby-debug 19。

谢谢, 贾斯汀。

72741 次浏览

你会得到你想要的,包括 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-debug 就可以用于我的所有 spec。

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

--debug

我发现在 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-debug 和 pry-ails。然后在代码中使用 binding.pry 打开一个交互式调试器控制台,它将统治世界!

对于 Ruby > = 1.9.2

你应该安装 调试器 gem 而不是 ruby-debug 19。如果你使用 打包机,你只需要把它放在你的 Gemfile:

group :test do
gem "debugger"
end

然后你就可以把

Rspec < 3.0

--debug

Rspec > = 3.0

-rdebugger

在你的 .rspec文件中

然后你就可以跑了

bundle exec rake spec

没有任何额外的参数。也有 不需要修改你的源代码(甚至没有您的测试源代码)

对于 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

最好和最干净的选择是在 .rspec文件中使用 --require。放置什么取决于使用哪个 gem 进行调试。

--color
--require pry
--require rails_helper

这些选项对应于命令行选项(- d 或—— debug 现在不推荐)。

请随意使用 debuggerruby-debugpry(窥探轨道在您的 Gemfile)。

关于你的 Gemfile:

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

require 'ruby-debug'等放在你的规范的顶部是简单地更紧密地耦合-特别是因为这里的最高投票评论建议把它个别地放在所有你的文件。有了新的 .rspec文件,你不再需要把 require 'spec_helper'或者 require 'rails_helper'放在文件的顶部。

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