我的一个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
内的代码?
答案 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),对于其他人来说可能不是。