我如何弄清楚我的脚本在哪里睡觉?

时间:2014-01-31 13:28:57

标签: ruby

我的一项单元测试非常慢,每次测试都需要超过一秒钟。分析该测试文件,前几行是:

  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
198.71    12.28     12.28        2  6140.00  6140.00  Mutex#sleep
 14.40    13.17      0.89     9658     0.09     1.09  REXML::Element#namespace
 10.68    13.83      0.66    18814     0.04     0.08  REXML::Element#root

我无法弄清楚睡眠呼叫的来源!我的整个应用程序只在一个名为Throttle的类中睡觉,我在它前面插入一个断点,在此测试期间不会触发。我试过了:

class Mutex
  def sleep(time)
    require "byebug"; byebug
  end
end

从未打破过,我试过了:

def setup
  Mutex.define_singleton_method(:sleep) { |time|
    require "byebug"; byebug
  }
end

这也绝对没有。我还使用Kernel代替Mutex尝试了这两种方法。我已经无数次阅读了我的代码,我不能为我的生活找出为什么我的应用程序一直在睡觉!任何人都可以给我任何指示吗?

1 个答案:

答案 0 :(得分:0)

我明白了。结果Mutex#sleep调用了Net::HTTP#post。我的单元测试引导脚本应该覆盖写入磁盘或发出网络请求的所有函数,但是我忘了要求我应该覆盖的函数,所以最终结果是我的覆盖被实际函数覆盖了,导致我的单元测试向在线API发出实际请求。

我只是偶然发现了这个,因为我正在逐步执行byebug中的代码。

一旦修复了引导程序脚本,我的单元测试就会一如既往地运行。