2011-01-03 27 views
6

Estoy probando algunos scripts que interactúan con los comandos del sistema. Su lógica depende del código de retorno de los comandos del sistema, es decir, el valor de $ ?. Por lo tanto, como un ejemplo simplificado, el guión podría decir:

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

Con el fin de ser capaz de probar estos métodos correctamente, me gustaría ser capaz de apagar el Kernel llamada backquote y establezca $? a un valor arbitrario, para ver si obtengo el comportamiento apropiado de la lógica en el método después de la llamada a la contraportada. ps es una variable de solo lectura, por lo que lo siguiente no funciona:

$? = some_number 

Puedo hacer algunas cosas simples: por ejemplo, configurar $? a cero o distinto de cero. Por ejemplo, establecerá $? a 0 ó 35212 (en mi sistema, de todos modos), dependiendo del valor de $ ?:

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

Lo que realmente me gustaría ser capaz de hacer es fijar $? a un valor específico (por ejemplo, 3 o 122), no solo cero o un valor arbitrario distinto de cero. No puedo encontrar una manera de hacer esto. (En caso de que importa, estoy probando el uso de Test :: Unidad y Mocha.)

Respuesta

10

EDIT: El uso de la sugerencia de Dennis Williamson:

command = "(exit 21)" 

y utilizar if $?.exitstatus == 0 en lugar de if $? == 0

+0

Aha! Gracias, eso funciona. Probé tu idea, pero me perdí la parte .exitstatus. Estaba usando .to_i (en efecto), que devuelve (en su ejemplo) 5376, no 21. – rleber

+0

@rleber: Podría ser tan simple como 'command = '(exit 21)'' (puede omitir el "bash - c "si lo envuelves entre paréntesis). –

+0

@Dennis, Nice - es más simple y más confiable también (cuando bash no está en '$ PATH'). –

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

¿Incluir esto en su objeto cuando sea necesario?

Cuestiones relacionadas