seb*_*ger 6 ruby time-travel cucumber aruba
以下场景几乎总结了我的问题:
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"
Run Code Online (Sandbox Code Playgroud)
它归结为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
Run Code Online (Sandbox Code Playgroud)
我在这里看到两个选项。
在被测系统中创建一个钩子,您可以使用它来注入所需的上下文,在此示例中,您可以将“当前时间”参数添加到您正在测试的命令行应用程序中。或者在应用程序配置文件或数据库中指定固定时间,有很多选项。这假定您拥有正在测试的应用程序并且可以进行此类更改。这仅需要一个非常小的改变,例如,如果指定了“当前时间”参数,则使用Timecop 冻结当时的时间。
找到一些方法将被测系统引入 Cucumber 进程。ruby -e "puts Time.now"在你的例子中,你可以不用花钱去instance_eval "puts Time.now"。更现实的是,您可以使用require应用程序,如果命令行运行程序只是一些实际执行工作的类的薄包装,那么您可以直接调用它们。或者,您可以填充任何预期的 ARGV 参数,模拟puts方法,仅require模拟文件,这应该给您在进程外运行它的近距离体验,但您将能够有效地使用 Timecop。
| 归档时间: |
|
| 查看次数: |
837 次 |
| 最近记录: |