2011-01-03 14 views
6

私はシステムコマンドとインターフェースするいくつかのスクリプトをテストしています。それらの論理は、システムコマンドのリターンコード、すなわち$?の値に依存する。だから、簡単な例として、スクリプトは言うかもしれない:

def foo(command) 
    output=`#{command}` 
    if $?==0 
    'succeeded' 
    else 
    'failed' 
    end 
end 

適切にこれらのメソッドをテストすることができるようにするために、私はカーネルバッククォートコール、およびセット$をスタブできるようにしたいですか?バッククォートコールの後のメソッドのロジックから適切な動作が得られるかどうかを調べるために、任意の値に設定します。 $?例えば、$設定:読み取り専用の変数がされているので、次は動作しません:

$? = some_number 

は、私はいくつかの簡単なものを行うことができますか? 0または非ゼロにする。たとえば、$を設定しますか? (とにかく私のシステム上、)0または35212に、$?:

def fail_or_succeed(success) 
    if success 
    `echo foo` 
    else 
    `a-non-existent-command 2>&1` 
    end 
end 

の値に応じて、私は本当に行うことができるようにしたいのですが何が$に設定するのですか?ゼロまたは任意の非ゼロでなく、特定の値(例えば、3または122)に変換することができる。私はこれを行う方法を理解することはできません。 (それが重要な場合は、私がテスト::ユニットとモカを使用してテストしています。)

答えて

10

EDIT:デニスウィリアムソンの提案を使用して

command = "(exit 21)" 

、代わりにif $? == 0

+0

Aha!ありがとう、それは動作します。私はあなたのアイデアを試しましたが、.exitstatusの部分を見逃していました。私は.to_iを使用していました(実際には)あなたの例では5376ではなく2176を返しています。 – rleber

+0

@rleber: 'command = '(exit 21)''と同じくらい簡単です( "bash - c "をカッコで囲んだ場合)。 –

+0

@Dennis、Nice - ($ bashが '$ PATH'にない時)もっと簡単で信頼性も高いです。 –

1
module Stubbed 
    def `(*args) 
    super("mycommand that returns the error code I want") 
    end 
end 
if $?.exitstatus == 0を使用

必要に応じてこれをオブジェクトに含めますか?

関連する問題