2017-04-27 122 views
0

我有一個耙使用OptionParser得到一個參數(12.0)任務Rake任務。測試使用OptionParser使用RSpec

任務看起來像

require 'optparse' 

namespace :local do 
    task :file do 
    options = Hash.new 

    opts = OptionParser.new 
    opts.on('--file FILE') { |file| 
     options[:file] = file 
    } 

    args = opts.order!(ARGV) {} 
    opts.parse!(args) 

    # Logic goes here. 
    # The following is enough for this question 
    String.new(options[:file]) 
    end 
end 

可以執行任務運行rake local:file -- --file=/this/is/a/file.ext

現在我想使用RSpec來驗證新的字符串被創建,但我不知道怎麼傳文件選項內的選項。

這是我的規格

require 'rake' 

RSpec.describe 'local:file' do 

    before do 
    load File.expand_path("../../../tasks/file.rake", __FILE__) 
    Rake::Task.define_task(:environment) 
    end 

    it "creates a string" do 
    expect(String).to receive(:new).with('zzzz') 
    Rake.application.invoke_task ("process:local_file") 
    end 
end 

,正確我得到

#<String (class)> received :new with unexpected arguments 
     expected: ("zzzz") 
       got: (nil) 

但如果我嘗試

Rake.application.invoke_task ("process:local_file -- --file=zzzz")

我得到

Don't know how to build task 'process:local_file -- --file=zzzz' (see --tasks)

我也試過Rake::Task["process:local_file"].invoke('--file=zzzz')但仍然got: (nil)

我應該如何通過在規範的選項?

感謝

+1

我從來沒有這麼做過,所以我不能發表評論,但這個看起來像你需要:http://stackoverflow.com/questions/825748/how-to-pass-command-line-arguments-to-a-rake-task?rq = 1 –

+0

感謝您指出了後出來。我改變了我的任務,現在我可以運行規範。 – macsig

+0

您好,歡迎光臨。 –

回答

0

既然你從ARGV(包含傳遞給腳本的參數數組)採取的選項:

args = opts.order!(ARGV) {} 

可以設置ARGV包含調用耙之前任何你想要的選項::任務。

對我來說(紅寶石1.9.3,軌3.2,rspec的3.4),像下面這樣的作品

argv = %W(local:file -- --file=zzzz) 
stub_const("ARGV", argv) 
expect(String).to receive(:new).with('zzzz') 
Rake::Task['local.file'].invoke() 

(按照慣例,ARGV [0]是腳本的名稱。)

+1

儘管此代碼可以回答這個問題,提供了關於如何和/或爲什麼它解決了這個問題將改善答案的長期價值附加的上下文。 – thewaywewere