2013-12-15 222 views
0

後,我正在MINITEST規範該模塊內的類,出現此錯誤:MINITEST未定義的方法

test_0001_must be true for option name(MyGem::OptionParser::option?): 
NoMethodError: undefined method `option?' for OptionParser:Class 

我測試的lib /選項/ options.rb :

module MyGem 
    class OptionParser 
    def self.option?(arg) 
     arg =~ /^-{1,2}\w+$/ 
    end 
    end 
end 

隨着投機/ options_spec.rb:

describe OptionParser do 
    describe "option?" do 
    it "must be true for option name" do 
     OptionParser.option?('--nocolor').must_equal true 
    end 
    end 
end 

運行測試與MyGem::OptionParser而不是僅僅OptionParser不會導致錯誤。但lib/script.rb上的類似測試無錯誤地運行,前綴爲MyGem::

我的文件結構:

gem/ 
|-lib/ 
| |-options/ 
| | |-options.rb 
| |-script.rb 
|-spec/ 
| |-script_spec.rb 
| |-options_spec.rb 
| |-spec_helper.rb 
|-Rakefile 

spec_helperinclude MyGem。我錯了什麼?

+0

嗨,leemour。您在之前的問題中沒有評論解決這個問題嗎?無論如何,你的'spec_helper'是怎麼樣的? – Gjaldon

+0

嗨,Gjaldon。我的評論仍然存在問題,所以我創建了一個新問題。 – leemour

回答

1

Minitest已經包含或自動加載了Ruby自己的OptionParser,所以推測是優先並阻止加載您的版本。這裏的證據:

MacbookAir1:so1 palfvin$ irb 
2.0.0p247 :001 > OptionParser 
NameError: uninitialized constant OptionParser 
    from (irb):1 
    from /Users/palfvin/.rvm/rubies/ruby-2.0.0-p247/bin/irb:16:in `<main>' 
2.0.0p247 :002 > require 'minitest' 
=> true 
2.0.0p247 :003 > OptionParser 
=> OptionParser 
2.0.0p247 :004 > 
+0

我沒有使用Rails。通過類似的測試,我的意思是在'lib/script.rb'中測試MyGem :: OtherClass的方法。 – leemour

+0

你給了我一個很好的提示'OptionParser'保留名。將它重命名爲「OptionsParser」後,測試就可以運行。非常感謝!我只是不明白,爲什麼有一個名稱衝突。 'OptionParser'附帶Ruby http://ruby-doc.org/stdlib-2.0.0/libdoc/optparse/rdoc/OptionParser.html,但是我沒有找到Minitest需要的地方。 – leemour

+0

只是想澄清,在我的例子中,我包含模塊,包含的類是可訪問的,而無需指定模塊前綴。當你的陳述是真實的時候,你能舉個例子嗎? – leemour

0

如果你有確切的你script.rb文件中定義的相同MyGem :: OptionParser,很可能是什麼原因造成您的規範問題。嘗試使用其他命名空間中options.rb您的代碼如下所示:

module MyOtherGem 
    class OptionParser 
    def self.option?(arg) 
     arg =~ /^-{1,2}\w+$/ 
    end 
    end 
end 

然後確保把它列入你的spec_helper或在您的options_spec文件。

+0

對不起,我剛剛意識到我無意中降低了你的答案,尤其是因爲我的錯誤而可悲。 ;-)如果你編輯它,我會刪除downvote。 –

+0

Lol剛編輯它。 :) – Gjaldon