2012-02-29 6 views
5

el escenario siguiente resume bastante bien mi problema:Prueba de una aplicación de línea de comandos con el pepino/Aruba/Timecop: Cómo inyectar el contexto

Scenario: problems with subprocesses 
    Given the date is 01/01/2012 10:31 
    When I run `ruby -e "puts Time.now"` 
    Then the output should contain "10:31" 

Se reduce a When I run ruby -e "puts Time.now" el lanzamiento de un proceso hijo y por lo tanto haciendo que todos mis Timecop.freeze stubs son ineficaces, ya que solo funcionan en el proceso principal. Necesito de alguna manera 'inyectar' el contexto actual en el comando que se ejecuta, pero parece que no puedo encontrar nada. ¿Estoy intentando algo imposible aquí?


El paso:

require 'timecop' 
Given /^the date is (\d+)\/(\d+)\/(\d+) (\d+):(\d+)$/ do |month, day, year, hour, minute| 
    Timecop.freeze(Time.local(year.to_i, month.to_i, day.to_i, hour.to_i , minute.to_i, 0)) 
end 

Respuesta

1

veo 2 opciones aquí.

  1. Crear un gancho en el sistema bajo prueba que se puede utilizar para inyectar el contexto necesario, en este ejemplo se podría añadir un parámetro 'hora' a la aplicación de línea de comandos que se está probando. Alternativamente, especifique un tiempo fijo en el archivo de configuración de la aplicación o base de datos, hay muchas opciones. Esto supone que posee la aplicación que está probando y puede realizar dichos cambios. Esto solo necesita un cambio muy pequeño, p. si se especifica el parámetro 'hora actual', entonces use Timecop para congelar la hora en ese momento.

  2. Encuentre alguna manera de poner el sistema bajo prueba en el proceso de pepino. En su ejemplo, en lugar de desgranar a ruby -e "puts Time.now", puede instance_eval "puts Time.now". De manera más realista, podría require la aplicación, y si el corredor de la línea de comandos es simplemente una capa delgada alrededor de algunas clases que realmente hacen el trabajo, entonces puede llamarlas directamente. Alternativamente, es posible que pueda rellenar los parámetros ARGV que se esperan, burlarse del método puts, y simplemente require el archivo, lo que debería proporcionarle una experiencia cercana para ejecutarlo fuera del proceso, pero podría usar Timecop efectivamente. .

Cuestiones relacionadas