2011-10-20 61 views
0

我的Rake任務之一調用黃瓜Rake::Task[:cucumber].invoke。在這之前,我的任務設置了一組應該由Cucumber場景使用的變量。從Rake傳遞參數到黃瓜場景

我應該怎麼做才能將Rake任務中的值傳遞給聲明中的代碼,該代碼在Cucumber Before聲明中運行?

這裏是我在Rake文件中的代碼:

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

回答

1

我的一個假設是錯誤的:耙子,黃瓜不要在同一個進程中運行,所以他們不共享相同的Ruby VM。

的解決方案是使用

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

這將使cucumber任務運行Rake中的相同的過程。這個解決方案的問題在於,Cucumber中的崩潰(在我的代碼中,從Cucumber場景中調用)將導致整個Rack崩潰。在我的情況下,這是一個可以接受的折衷方案(我的Rakefile唯一的一點是準備一個合適的環境,然後在其中運行黃瓜),對於其他情況則不然。

1

設置環境變量可能是最簡單的:

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

,並在您之前塊:

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

是的,我知道,但我希望有更好的方法。 Rack和Cucumber都運行在同一個VM中,共享可變空間。我想有一種通用的方式讓他們說話,不是嗎? – gioele

+0

你的黃瓜任務究竟是如何定義的? – jodell

+0

這只是一個簡單的'需要'黃瓜/耙/任務';黃瓜::耙:: Task.new'。 – gioele