在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
。我有什么问题?
答案 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文件中。