【问题标题】:Running ruby debug in rspec?在 rspec 中运行 ruby​​ 调试?
【发布时间】:2011-07-23 17:27:17
【问题描述】:

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

谢谢, 贾斯汀。

【问题讨论】:

  • 我最终使用了 Pry,更容易/更好。插入 Gemfile 并安装后,将“binding.pry”扔到规范中的任何位置,执行,然后你就开始了。有关详细信息,请参阅屏幕截图。
  • Pry 是一个很棒的对象浏览器,但是(即使使用 pry-nav)它只是没有调试器 gem 所具有的调试器功能。我希望它这样做,但我已经回到调试器。

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


【解决方案1】:

对于 Ruby >= 1.9.2

您应该安装 debugger gem 而不是 ruby​​-debug19。如果您使用bundler,您只需将其放入您的 Gemfile:

group :test do
  gem "debugger"
end

之后就可以放了

rspec
--debug

rspec >= 3.0

-rdebugger

在您的 .rspec 文件中

然后你就可以运行了

bundle exec rake spec

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

【讨论】:

  • +1 并感谢您指出这一点。 enable 调试器没有代码修改,但您必须修改测试代码以 invoke 调试器,完全如原始问题顶部所示(添加debugger 声明)。此外,如果您使用 spork 运行测试,则 rdb 提示符将出现在 spork 控制台中,它不会回显您输入的内容。似乎在没有 spork 的情况下最容易运行。
  • 如果你使用byebug,那么它就变成了-rbyebug
【解决方案2】:

最好和最干净的选择是在您的.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' 放在文件顶部。

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

【讨论】:

    【解决方案3】:

    通过在规范顶部添加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 可用于我的所有规范。

    【讨论】:

    • 这里注意:我的解决方案适用于将 ruby​​ 调试添加到一个特定的规范文件,zetetic 的解决方案可以调试整个项目。
    • 该解决方案对我不起作用。我得到:无法加载此类文件 -- ruby​​-debug (LoadError)
    • 回复:以上。需要使用 ruby​​-debug19 gem 取消注释 Gemfile 行。 (实际上将其放入 :test, :development 组。)现在可以使用。
    • 取决于您用于调试的 GEM。我使用"pry-rails""pry-byebug",所以我会使用require 'pry-rails'。同样在 Gemfile 中,它们需要包含在 test environment
    【解决方案4】:

    我发现在 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 来打开一个交互式调试器控制台来统治世界!

    【讨论】:

    • 巨大的+1,这是一个非常好的提示
    • 这没有回答问题。
    • phatmann,这是 Rails 3 中允许登录 rspec 测试的最正确方法。将方法添加到 spec_helper.rb 文件后,您可以使用logger.debug "#{1.class}" 记录调试语句。你的调试语句。
    • 投反对票。 OP 询问的是调试器断点,而不是日志记录(这在规范中并不是最好的主意)。
    • 投反对票,原因与@MarnenLaibow-Koser 相同。可能是有用的信息,但不能回答 OP 的实际问题。
    【解决方案5】:

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

    【讨论】:

    • 由于某种原因,此解决方案不起作用。通过测试
    • @Trip 这很有趣,也许可以代替byebug 尝试添加debugger
    【解决方案6】:

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

    --debug
    

    【讨论】:

    • invalid option: --debug (defined in ./.rspec)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多