将参数从Rake传递到Cucumber场景

时间:2011-10-20 20:51:44

标签: ruby cucumber rake

我的一个Rake任务用Rake::Task[:cucumber].invoke调用Cucumber。在此之前,我的任务设置了一组应由Cucumber场景使用的变量。

为了将Rake任务中提供的值传递给在Cucumber Before声明中运行的代码,我该怎么做?

以下是我在Rakefile中的代码:

task :test, [:site] do |t, args|
    args = args.with_defaults(:site => DEFAULT_SITE)

    $site = args[:site]

    Rake::Task[:cucumber].invoke
end

Before中的代码现在就是这样的:

Before do
    if $site.ends_with?('.html')
        @engine = PageTester
    else
        @engine = SiteTester
    end
end

此代码不应该做任何花哨的事情,只需根据命令行中收到的内容选择某个类。如何将site参数传递给Before内的代码?

2 个答案:

答案 0 :(得分:1)

设置环境变量可能最简单:

ENV['_SITE'] = args[:site]

并在你的前一栏:

if ENV['_SITE'] && ENV['_SITE'].ends_with?('.html')

答案 1 :(得分:1)

我的一个假设是错误的:Rake和Cucumber不会在同一个进程中运行,因此它们不共享相同的Ruby VM。

解决方案是使用

Cucumber::Rake::Task.new do |task|
    task.fork = false
end

这将使cucumber任务在Rake的相同过程中运行。这个解决方案的问题是Cucumber崩溃(在我的代码中,从Cucumber方案调用)将导致整个Rack崩溃。在我的情况下,这是一个可接受的权衡(我Rakefile的唯一要点就是准备一个合适的环境,然后在其中运行Cucumber),对于其他人来说可能不是。