我继承了一大堆Ruby代码,坦率地说,对于像我这样的凡人来说,这几乎是不可能理解的.它实际上是Rspec单元测试代码,但它的 struct "非常不同寻常".

我希望能够运行代码,并将以下信息记录在某个地方:

  • 每个被调用的方法,包括定义该方法的类的名称,以及定义被调用方法的文件名(是的,我们在多个不同的文件中定义了相同的类/方法,很难知道调用了哪个)
  • (可选)传递给调用的每个方法的参数

这样,我就可以开始try 重构它了.没有它,由于代码库(20k+单元测试用例)的大小,将是一项非常困难的任务.

我负担不起对正在运行的代码进行大规模编辑,因为即使你在代码周围使用苛刻的语言(例如频繁使用),代码也会崩溃.相反,我需要能够在代码的现有状态下对其进行检测,或者对现有代码进行最小的更改.

有没有一种方法可以记录这种级别的详细信息,而不必对代码库进行大规模更改?我已经看过Ruby profiler,看看它是否有帮助,而且可能有帮助;我很好奇是否有更好的方法(尤其是记录包含调用方法的文件名).

提前谢谢

推荐答案

这绝对是可能的——事实上,甚至有一种方法可以做到这一点!只需在开始记录之前的代码中添加以下内容:

set_trace_func proc { |event, file, line, id, binding, classname|
  printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
}

你想要的秘方来自100,如上所述:

  • set_trace_func(proc) => proc
  • set_trace_func(nil) => nil

proc设置为跟踪的处理程序,如果参数为nil,则禁用跟踪.proc最多包含六个参数:事件名称、文件名、行号、对象id、绑定和类名称.proc在事件发生时被调用.事件包括:c-call(调用C语言 routine )、c-return(从C语言 routine 返回)、call(调用Ruby方法)、class(启动类或模块定义)、end(完成类或模块定义)、line(在新行上执行代码)、raise(引发异常)和return(从Ruby方法返回).在proc上下文中禁用跟踪.

下面是一个简单的例子:

class Test
  def test
    a = 1
    b = 2
  end
end

set_trace_func proc { |event, file, line, id, binding, classname|
  printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
}

t = Test.new
t.test

(注意:除非你想要一个巨大的文本滚动屏幕,否则不要在irb中try .)结果是:

    line test.rb:11               false
  c-call test.rb:11        new    Class
  c-call test.rb:11 initialize   Object
c-return test.rb:11 initialize   Object
c-return test.rb:11        new    Class
    line test.rb:12               false
    call test.rb:2        test     Test
    line test.rb:3        test     Test
    line test.rb:4        test     Test
  return test.rb:4        test     Test

您可以使用上面的格式化字符串来获得想要记录的结果(例如,听起来您只对call个事件感兴趣).希望这会有所帮助,祝你好运,顺利完成所有的单元测试!

Ruby相关问答推荐

当bsearch将数组中的第一个元素与2个值匹配时,它返回nil.为什么?

当数据包含换行符时,Ruby PKCS7 无法验证

当我在 Ruby 中围绕最后一个字符拆分时,如何拆分字符串?

如何在 ruby​​ 中通过 SSL 调用 HTTP POST 方法?

在 Ruby 中导出环境变量

在 Ruby 中生成一个后台进程

`expect`测试中的Rspec`eq`与`eql`

如何以不同 colored颜色 输出我的 ruby​​ 命令行文本

如何在 ruby​​ 中编写负循环,例如 for(i=index; i >= 0; i --)

使用 Homebrew 安装 Ruby

是否有等效于 `Array::sample` 的哈希值?

用反斜杠单引号替换单引号

如何在 ruby​​ 中针对正则表达式测试整个字符串?

如何获取符号链接的目标?

Javascript 是否有类似 Ruby 的 method_missing 功能?

文字数字中的下划线是什么意思?

是什么让 Ruby 变慢了?

HAML 中 Javascript 中的 Ruby 方法

判断 Ruby 中是否存在 URL

将 lambda 作为块传递