我可以设置$吗?在考试?

时间:2012-07-26 18:40:41

标签: ruby unit-testing ipc ruby-1.9.2

我有一个Ruby程序。该计划

IO.popen('blah') { ... }
if $?.success?
   ...

大部分时间$?都是Process::Status个对象。偶尔它会变为零。那会导致程序崩溃。很容易解决,对吧?

但我想写一个测试。

我有模拟IO.popen调用的技术,但我不能将$?设置为nil,因为它是只读的。如何将$?设置为nil?

1 个答案:

答案 0 :(得分:4)

据我所知你不能设置这个。通过C代码,全局变量实际上可以扩展为函数调用,这就是这里发生的事情(rb_last_status_get

最简单的方法是定义一个更容易存根的方法,例如

module Process
  def self.last_status
    $?
  end
end

然后使用Process.last_status代替$?。你可以在规范中明确地将其排除在外,如果你对所有魔法全局变量感到困惑,它会更具可读性。