2013-12-14 50 views
3

我試圖與規格的語法與rake test運行MINITEST和得到這個錯誤:MINITEST未初始化的恆定誤差

/path/to/gem/spec/script_spec.rb:3:in `<top (required)>': uninitialized constant MyGem (NameError) 

我的Rakefile:

require 'rake/testtask' 

Rake::TestTask.new do |t| 
    t.test_files = FileList['spec/*_spec.rb'] 
end 

我的文件結構:

我的script.rb:

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

使用MINITEST ::規格語法script_spec.rb:

require "minitest/autorun" 

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

如何解決呢?也許lib文件夾未加載?我錯過與Spec語法相關的內容嗎?

回答

4

MyGem::OptionParser未加載到您的測試中。您需要在您的spec文件中要求它,或創建一個spec_helper,您需要在所有測試中需要的所有文件,因此您只需要在規格中使用require 'spec_helper'

此外,由於您使用的是spec語法,因此您必須'require'minitest/spec'。你spec_helper看起來是這樣的:

# spec/spec_helper.rb 
require 'minitest/spec' 
require 'minitest/autorun' 
require 'script' 

而且這樣做是爲了您的Rake文件,所以你可以在你的規範,而不是做require_relative '../lib/script'require 'script'像上面。

require 'rake/testtask' 

Rake::TestTask.new do |t| 
    t.test_files = FileList['spec/*_spec.rb'] 
end 

最後,您對規範工作,在你script_spec文件的頂部添加require 'spec_helper「。您必須爲所有規格文件執行此操作,並確保將所需文件的所有文件的要求添加到spec_helper文件中。

既然你還做了規範式的測試,你可能想測試改成這樣:

MyGem::OptionParser.option?('--nocolor').must_equal true 

你也可以有這樣的代碼在你的「spec_helper」文件自動加載的所有文件在您的lib文件夾中:

Dir["../lib/**/*.rb"].each do |rb_file| 
    require rb_file 
end 

希望這有助於!

+0

我不明白爲什麼Rake使用't.libs'呢?我認爲它應該從't.libs'文件夾加載所有文件。默認情況下,'Rake :: TestTask'將'lib'添加到'libs',所以不需要寫't.libs = ['lib']'或類似的東西。我試圖做到這一點,以防萬一,並沒有影響。 – leemour

+0

我明白了。沒有意識到這一點!在這種情況下,我會從我的答案中刪除該行。我的答案是否解決了您的問題? – Gjaldon

+0

我想我現在明白了。還有一個問題。如果我的'script.rb'(在spec_helper.rb中需要)需要我所有的其他gem文件,我應該只需要它,就是這樣嗎?或者我應該對不同的文件分別進行測試?最佳做法是什麼? – leemour