2012-02-29 27 views
5

następujący scenariusz dość dużo podsumowuje mój problem:Testowanie aplikacji poleceń z ogórka/aruba/TimeCop: Jak wstrzykiwać kontekście

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" 

Sprowadza się ona do When I run ruby -e "puts Time.now" rozpoczęcie procesu potomnego i czyniąc wszystko moje numery Timecop.freeze są nieskuteczne, ponieważ działają tylko w głównym procesie. Muszę jakoś "wstrzyknąć" bieżący kontekst do uruchamianego polecenia, ale wydaje mi się, że nie jestem w stanie wymyślić niczego. Czy próbuję tutaj czegoś niemożliwego?


Etap:

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 

Odpowiedz

1

widzę tu 2 opcje.

  1. Tworzenie hak w systemie na podstawie testu, który można wykorzystać, aby wprowadzić żądany kontekst, w tym przykładzie można dodać parametr „” aktualny czas do aplikacji wiersza poleceń, że jesteś testowania. Ewentualnie określ stały czas w pliku konfiguracyjnym aplikacji lub w bazie danych, jest wiele opcji. Zakłada to, że jesteś właścicielem aplikacji, którą testujesz i możesz wprowadzać takie zmiany. To musi być tylko bardzo mała zmiana, np. jeśli określono parametr "aktualny czas", użyj Timecop, aby zatrzymać czas w tym czasie.

  2. Znajdź sposób na przetestowanie systemu w procesie Ogórek. W twoim przykładzie zamiast ostrzeliwać do ruby -e "puts Time.now", możesz instance_eval "puts Time.now". Bardziej realistycznie, możesz require aplikacji, a jeśli runner wiersza poleceń jest po prostu cienkim opakowaniu wokół niektórych klas, które faktycznie wykonują pracę, możesz je wywołać bezpośrednio. Ewentualnie możesz być w stanie wypełnić wszystkie parametry ARGV, wyśmiewać metodę puts i po prostu plik, który powinien dać ci bliskie doświadczenie, aby zakończyć proces, ale będziesz mógł efektywnie używać Timecop .