OptionParser类的Minitest未定义方法

时间:2013-12-15 17:17:49

标签: ruby minitest

spec_helper中包含一个模块后,我在该模块中运行Minitest规范并获取此错误:

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

我正在测试lib / options / options.rb:

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

使用spec / 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

include MyGem中的spec_helper。我有什么问题?

2 个答案:

答案 0 :(得分: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 > 

答案 1 :(得分: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文件中。