2011-10-20 3 views
0

私のRakeタスクの1つは、Rake::Task[:cucumber].invokeでCucumberを呼び出します。それを行う前に、私のタスクは、キュウリのシナリオで使用されるべき変数のセットを設定します。RakeからCucumberシナリオへの引数を渡す

Rakeタスクで利用可能な値を、キュウリのBefore宣言内で実行されるコードに渡すにはどうすればよいですか?ここで

私はRakefileを持っているコードです:、

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

このコードは、派手な何かを行うことになっていないだけで選択します。これはBeforeのコードが今ある方法です

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

    $site = args[:site] 

    Rake::Task[:cucumber].invoke 
end 

コマンドラインで受け取ったものに基づいて特定のクラスを作成します。 site引数をBeforeのコードに渡すにはどうすればよいですか?

答えて

1

一つが間違っていた:レーキとキュウリは、同じプロセスで実行していません、彼らは同じRuby VMを共有しません。

ソリューションは、レーキの同じプロセスでcucumberタスクの実行を行います

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

これを使用することです。この解決策の問題点は、キュウリのクラッシュ(私のコードでは、キュウリのシナリオから呼ばれた)がラック全体を破壊するということです。私の場合、これは受け入れられるトレードオフです(私のRakefileの唯一のポイントは、適切な環境を準備してからキュウリを実行することです)。

1

環境変数を設定する最も簡単かもしれません:

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

とあなたの前にブロック内:

私の仮定の
if ENV['_SITE'] && ENV['_SITE'].ends_with?('.html') 
+0

はい、私は知っていますが、もっと良い方法があることを望んでいました。 RackとCucumberは同じVM内で実行され、変数空間を共有します。彼らに話をする一般的な方法があると思いますが、そこにはありませんか? – gioele

+0

キュウリの仕事はどのくらい正確に定義されていますか? – jodell

+0

これは単なる 'キュウリ/レイク/タスク 'を必要とするものです。 Cucumber :: Rake :: Task.new'。 – gioele

関連する問題