2012-02-29 53 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 。