我正在努力了解Rake如何处理Cucumber任务。我可能做错了,但看不出“正确”的方式。
我有以下任务:
namespace :features do
Cucumber::Rake::Task.new(:browser, 'Run Cucumber Features using a Browser') do |t|
t.profile = ENV['HUDSON'] ? 'browser_hudson' : 'browser'
setup_environment
check_profile(t.profile)
end
Cucumber::Rake::Task.new(:headless, 'Run Cucumber Features using a Headless Browser') do |t|
t.profile = ENV['HUDSON'] ? 'hudson' : 'default'
setup_environment
check_profile(t.profile)
end
end
这对我来说似乎很直接。
问题是当我运行任何黄瓜任务时,我看到两个任务都执行了。所以,如果我这样做:
rake features:browser
或
rake features:headless
我看到setup_environment和check_profile运行两次,然后调用实际任务。我最终看到了这样的事情:
setup_environment called
check_profile called, running in browser
setup_environment called
check_profile called, running headless
** Invoke features:browser (first_time)
** Execute features:browser
当然,它现在无头。
我猜我不应该在Cucumber任务的任务定义中做任何“工作”。有没有我应该考虑的替代方案来解决这个问题?
答案 0 :(得分:1)
我通过执行以下操作解决了这个问题:
task :browser => ['features:setupenv', 'features:isbrowser', 'features:browser'] do
end
task :headless => ['features:setupenv', 'features:headless'] do
end
这两项新功能的任务是:
task :setupenv do
setup_environment
end
task :isbrowser do
ENV['BROWSER'] ||= 'true'
end
这有效,但仍然没有回答为什么Cucumber任务与标准Rake任务的运行方式不同的问题。我想我认为Cucumber rake任务扩展了标准的Rake任务是一个很糟糕的假设,当真正发生的事情是正在动态构建Rake任务时。为了实现这一点,代码需要执行,而不是作为指向该代码的指针以便稍后执行(这是我假设会发生的)