2012-02-29 9 views
5

il seguente scenario praticamente riassume il mio problema:Test un'applicazione a riga di comando con il cetriolo/Aruba/Timecop: Come iniettare contesto

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" 

Si riduce a When I run ruby -e "puts Time.now" lanciare un processo figlio e facendo tutti così i miei stub Timecop.freeze non funzionano, poiché funzionano solo sul processo principale. Devo in qualche modo "iniettare" il contesto corrente nel comando che viene eseguito, ma non riesco a trovare nulla. Sto provando qualcosa di impossibile qui?


Il passo:

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 

risposta

1

vedo 2 opzioni qui.

  1. Creare un gancio nel sistema in prova che è possibile utilizzare per iniettare il contesto necessario, in questo esempio si potrebbe aggiungere un parametro 'ora corrente' per l'applicazione a riga di comando che si sta testando. In alternativa, specificare un tempo fisso nel file di configurazione dell'app o nel database, ci sono molte opzioni. Ciò presume che tu possieda l'app che stai testando e che possa apportare tali modifiche. Questo deve essere solo un cambiamento molto piccolo, ad es. se viene specificato il parametro "ora corrente", utilizzare Timecop per bloccare l'ora in quel momento.

  2. Trova un modo per portare il sistema sotto test nel processo Cucumber. Nel tuo esempio invece di eseguire il bombardamento su ruby -e "puts Time.now", potresti instance_eval "puts Time.now". Più realisticamente, è possibile eseguire l'app require e, se il conduttore della riga di comando è semplicemente un involucro sottile attorno ad alcune classi che eseguono effettivamente il lavoro, è possibile chiamarle direttamente. In alternativa, potresti essere in grado di popolare qualsiasi parametro ARGV previsto, prendere in giro il metodo puts e solo il file require, che dovrebbe darti un'esperienza approfondita per eseguirlo fuori processo, ma potresti utilizzare Timecop in modo efficace .

Problemi correlati