开发者

Why are my Cucumber Rake Tasks executing even though I did not ask them to?

I'm struggling with understanding how Rake processes Cucumber tasks. I'm probably doing this wrong, but can't see what the "right" way is.

I've got the following tasks:

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

This seems straight forward to me.

The problem is when I run any of the cucumber tasks, I'm seeing both tasks execute. So if I do:

rake features:browser

or

rake features:headless

I see setup_environment and check_profile run twice, and then the actual task getting invoked. I end up seeing something like this:开发者_StackOverflow

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

And of course, it's now running headless.

I'm guessing I shouldn't be doing any "work" inside the task definition for a Cucumber task. Is there an alternative I should be looking into to accomplish this problem?


I resolved this issue by doing the following:

task :browser => ['features:setupenv', 'features:isbrowser', 'features:browser'] do
end

task :headless => ['features:setupenv', 'features:headless'] do
end

The two new features tasks are:

task :setupenv do
  setup_environment
end

task :isbrowser do
  ENV['BROWSER'] ||= 'true'
end

This works, but still doesn't answer the question why Cucumber tasks operate differently from standard Rake tasks. I guess it's a bad assumption on my part that Cucumber rake tasks extended a standard Rake task, when what's really happening is a Rake Task is being constructed dynamically. In order for that to happen, the code needs to execute, rather than act as a pointer to that code for execution later (which is what I assumed would happen)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜