最小测试未初始化的常量错误

lee*_*our 6 ruby minitest

我正在尝试使用Spec语法运行Minitest rake test并出现以下错误:

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

我的Rakefile:

require 'rake/testtask'

Rake::TestTask.new do |t|
  t.test_files = FileList['spec/*_spec.rb']
end
Run Code Online (Sandbox Code Playgroud)

我的文件结构:

gem/
--lib/
----script.rb
--spec/
----script_spec.rb
--Rakefile
Run Code Online (Sandbox Code Playgroud)

我的script.rb:

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

在script_spec.rb中使用Minitest :: Spec语法:

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
Run Code Online (Sandbox Code Playgroud)

我如何解决它?也许lib文件夹未加载?我会错过与Spec语法相关的内容吗?

Gja*_*don 5

MyGem::OptionParser未加载到您的测试中。您要么需要在规范文件中要求它,要么创建一个spec_helper,在其中您需要在所有测试中都需要的所有文件,因此只需要require 'spec_helper'在规范中。

另外,由于您使用的是spec语法,因此您将需要`minitest / spec'。您的spec_helper如下所示:

# spec/spec_helper.rb
require 'minitest/spec'
require 'minitest/autorun'
require 'script'
Run Code Online (Sandbox Code Playgroud)

然后对您的Rakefile执行此操作,这样您就可以require 'script'像上面一样在规范中这样做,而不是这样做require_relative '../lib/script'

require 'rake/testtask'

Rake::TestTask.new do |t|
  t.test_files = FileList['spec/*_spec.rb']
end
Run Code Online (Sandbox Code Playgroud)

最后,为了使规范require 'spec_helper生效,请在script_spec文件顶部添加'。您必须对所有规格文件执行此操作,并确保将规格中需要加载的所有文件的require添加到spec_helper文件中。

由于您还在进行规范样式的测试,因此您可能需要将测试更改为此:

MyGem::OptionParser.option?('--nocolor').must_equal true
Run Code Online (Sandbox Code Playgroud)

您还可以在“ spec_helper”文件中包含如下代码,以自动加载lib文件夹中的所有文件:

Dir["../lib/**/*.rb"].each do |rb_file|
  require rb_file
end
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 我在spec_helper中添加了include MyGem,它适用于lib中的文件,但不适用于lib / options中的文件。如果我从MyGem :: OptionParser中删除MyGem ::,我会得到NoM​​ethodError:undefined method'option?'。对于OptionParser:Class`。 (2认同)