【问题标题】:Pass arguments from Rake to a Cucumber scenario将参数从 Rake 传递到 Cucumber 场景
【发布时间】:2011-12-12 03:04:32
【问题描述】:

我的 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 中的代码?

【问题讨论】:

    标签: ruby cucumber rake


    【解决方案1】:

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

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

    在你的前块中:

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

    【讨论】:

    • 是的,我知道,但我希望有更好的方法。 Rack 和 Cucumber 都在同一个 VM 中运行,共享变量空间。我想有一种通用的方法可以让他们说话,不是吗?
    • 你的黄瓜任务到底是怎么定义的?
    • 只是一个简单的require 'cucumber/rake/task'; Cucumber::Rake::Task.new
    【解决方案2】:

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

    解决办法是用

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-20
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      相关资源
      最近更新 更多