2012-02-29 31 views
5

下面的場景幾乎總結我的問題:測試與黃瓜/阿魯巴/時空特警一個命令行應用程序:如何注入上下文

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" 

它歸結爲When I run ruby -e "puts Time.now"啓動一個子進程,從而使所有的我的Timecop.freeze存根無效,因爲它們只在主流程上工作。我需要以某種方式將當前上下文「注入」到正在運行的命令中,但我似乎無法想出任何東西。我在這裏嘗試不可能的事情嗎?


步驟:

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 

回答

1

我在這裏看到2個選項。

  1. 下的測試,你可以用它來注入所需的範圍內,在這個例子中,你可以「當前時間」參數添加到您正在測試的命令行應用程序在系統中創建一個鉤。或者在應用程序配置文件或數據庫中指定一個固定時間,有很多選項。這假定您擁有您正在測試的應用程序,並且可以進行此類更改。這隻需要很小的改變,例如如果指定了'當前時間'參數,則使用Timecop來凍結當時的時間。

  2. 找到一些方法將被測系統帶入黃瓜進程。在你的例子中,而不是炮轟到ruby -e "puts Time.now",你可以instance_eval "puts Time.now"。更實際的情況是,你可以使用require這個應用程序,如果命令行參賽者只是一些實際完成工作的類的簡單包裝,那麼你可以直接調用它們。或者,您可能能夠填充所需的任何ARGV參數,剔除puts方法和該文件的require,這應該給您一個非常好的體驗,可以使其脫離進程,但您可以有效地使用Timecop 。