2013-12-14 4 views
3

Я пытаюсь запустить MiniTest с Spec синтаксис с rake test и получаю эту ошибку: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 

Моя структура файла:

My script.rb:

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

Использование синтаксиса Minitest :: Spec в 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, вам придется «требовать» minitest/spec. Ваш spec_helper будет выглядеть примерно так:

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

И сделать это к вашему Rakefile, так что вы можете сделать require 'script' как выше в ваших спецификациях, а не делать require_relative '../lib/script'.

require 'rake/testtask' 

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

Наконец, для вашей спецификации работать, добавьте require 'spec_helper 'в верхней части script_spec файла. Вам нужно будет сделать это для всех ваших файлов спецификаций и обязательно добавьте требование для всех файлов, которые вам нужно загрузить в своих спецификациях, в ваш файл spec_helper.

Поскольку вы также делаете тестирование спецификации стиля, вы можете захотеть изменить свой тест на это:

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

Вы также можете иметь код, как это в вашем файле «spec_helper», чтобы автоматически загрузить все файлы в вашей папке с папкой:

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

Смежные вопросы