1

私はRubyプログラムを持っています。そのプログラムは行きます

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

ほとんどの場合$?Process::Statusオブジェクトです。場合によっては、代わりにnilになります。それはプログラムをクラッシュさせます。修正するのは簡単ですよね?

しかし、私はテストを書きたいです。

IO.popen呼び出しをモックするテクノロジーがありますが、$?読み取り専用であるため、nilに設定できません。どうすれば$?nilに設定できますか?

4

1 に答える 1

4

私の知る限り、これを設定することはできません。C コードを介して、グローバル変数は実際に関数呼び出しに展開できます。これがここで行われることです ( rb_last_status_get)

最も簡単なのは、スタブ化が容易なメソッドを定義することです。たとえば、

module Process
  def self.last_status
    $?
  end
end

次にProcess.last_status、$? の代わりに使用します。明らかにこれを仕様書に書き出すことができ、すべての魔法のグローバルの間で混乱した場合でも、もう少し読みやすくなります。

于 2012-07-30T12:44:40.910 に答える