2011-01-03 8 views
6

Ich teste einige Skripte, die mit Systembefehlen interagieren. Ihre Logik hängt von dem Rückkehrcode der Systembefehle ab, d. H. Dem Wert von $ ?. So, wie ein vereinfachtes Beispiel könnte das Skript sagen:

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

Um richtig, diese Methoden testen zu können, ich möchte in der Lage sein, den Anruf Backquote Kernel Stub und $ gesetzt? zu einem willkürlichen Wert, um zu sehen, ob ich von der Logik in der Methode nach dem Backquote-Aufruf entsprechendes Verhalten bekomme. $? eine schreibgeschützte Variable ist, so dass die folgende funktioniert nicht:

$? = some_number 

Ich kann ein paar einfache Dinge tun: $ zum Beispiel festgelegt? zu Null oder nicht Null. Zum Beispiel wird $? entweder auf 0 oder 35212 (auf meinem System, sowieso), je nach dem Wert von $ ?:

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

Was würde ich ist gerne in der Lage sein zu tun, wirklich $ zu setzen? auf einen spezifischen Wert (z. B. 3 oder 122), nicht nur auf Null oder einen beliebigen Wert ungleich Null. Ich kann keinen Weg finden, dies zu tun. (Falls es wichtig ist, teste ich Test :: Unit und Mokka.)

Antwort

10

EDIT: Mit Dennis Williamson Vorschlag:

command = "(exit 21)" 

und verwenden if $?.exitstatus == 0 statt if $? == 0

+0

Aha! Danke, das funktioniert. Ich hatte deine Idee ausprobiert, aber den .exitstatus Teil verpasst. Ich benutzte .to_i (in der Tat), das (in Ihrem Beispiel) 5376, nicht 21 zurückgibt. – rleber

+0

@rleber: Es könnte so einfach sein wie 'command = '(exit 21)'' (Sie können die "bash - c "wenn Sie es in runde Klammern setzen". –

+0

@Dennis, Nizza - es ist auch einfacher und zuverlässiger (wenn bash nicht in $ PATH ist). –

1
module Stubbed 
    def `(*args) 
    super("mycommand that returns the error code I want") 
    end 
end 

Fügen Sie dies bei Bedarf in Ihr Objekt ein?

Verwandte Themen