在rspec中运行ruby调试?

All*_*ate 75 rake rspec ruby-on-rails ruby-debug

我试图让Ruby调试器在我的一个规范中运行:

describe User do
  it "should be valid" do
    debugger
    User.new.should be_valid
  end
end
Run Code Online (Sandbox Code Playgroud)

当我运行rspec时,我得到:

debugger statement ignored, use -d or --debug option to enable debugging
Run Code Online (Sandbox Code Playgroud)

我尝试过以下方法:

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/
Run Code Online (Sandbox Code Playgroud)

关于如何以正确的方式执行rspec的任何想法?我在Rails 3.0.5,Ruby 1.9.2,RSpec 2.5.1,ruby-debug19上.

谢谢,贾斯汀.

Chr*_*ean 70

您可以通过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
Run Code Online (Sandbox Code Playgroud)

然后你会跑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
Run Code Online (Sandbox Code Playgroud)

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

  • 该解决方案对我不起作用。我得到:**无法加载这样的文件——ruby-debug (LoadError)** (2认同)
  • Re:以上.需要使用ruby-debug19 gem取消注释Gemfile行.(把它放入:测试,实际上是开发组.)现在工作. (2认同)

zet*_*tic 27

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

--debug
Run Code Online (Sandbox Code Playgroud)

  • `无效选项: - debug(在./.rspec中定义)` (2认同)

Jar*_*arl 22

对于Ruby> = 1.9.2

您应该安装调试器 gem 而不是 ruby-debug19.你使用bundler,你只需将它放在你的Gemfile中:

group :test do
  gem "debugger"
end
Run Code Online (Sandbox Code Playgroud)

之后你可以放

rspec <3.0

--debug
Run Code Online (Sandbox Code Playgroud)

rspec> = 3.0

-rdebugger
Run Code Online (Sandbox Code Playgroud)

在你的.rspec文件中

然后你就可以跑了

bundle exec rake spec
Run Code Online (Sandbox Code Playgroud)

没有任何额外的论点.有没有必要修改源代码是(甚至不是你的测试源代码)

  • 如果你使用byebug,它就变成了-rbyebug (4认同)
  • +1并感谢指出这一点.*enable*调试器没有代码修改,但您必须修改测试代码以*调用*调试器,完全如原始问题顶部所示(添加`debugger`语句).此外,如果您使用spork运行测试,rdb提示符将出现在spork控制台中,它不会回显您键入的内容.似乎最容易运行而没有spork. (3认同)

dri*_*nor 16

对于ruby 2.0我使用byebug:https://github.com/deivid-rodriguez/byebug

gem 'byebug'
Run Code Online (Sandbox Code Playgroud)

码:

# 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
Run Code Online (Sandbox Code Playgroud)


Ode*_*Ode 9

我在rSpec中调试的最佳方法是将以下内容添加到'spec_helper.rb'文件中

def logger
  Rails.logger
end
Run Code Online (Sandbox Code Playgroud)

然后,您可以访问rSpec文件中的所有记录器方法,并将诸如标记记录之类的内容合并到一起.这当然适用于Rails 3及更高版本.如果您在Rails 3之前有任何内容,请添加以下内容:

def logger
  RAILS_DEFAULT_LOGGER
end
Run Code Online (Sandbox Code Playgroud)

准备好日志记录后,即可输入

tail -f log/test.log
Run Code Online (Sandbox Code Playgroud)

在终端shell中,以便在运行测试时查看日志记录语句.

当然,在你的实际rspec测试中,你会输入诸如

logger.debug "#{1.class}"  # => Fixnum
Run Code Online (Sandbox Code Playgroud)

如果要从测试日志的其余部分过滤调试语句,只需在调试语句中添加一个随机字符串,并将tail命令的输出传递给grep.

例:

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

tail -f log/test.log | grep random_string
Run Code Online (Sandbox Code Playgroud)

更新

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

  • Downvoting.OP询问调试器断点,而不是记录(无论如何,这不是规格中最好的想法). (2认同)