ruby Minitest未初始化常数错误

qlzsbp2j  于 2023-10-18  发布在  Ruby
关注(0)|答案(2)|浏览(121)

我尝试使用rake test的Spec语法运行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

我的文件结构:

gem/
--lib/
----script.rb
--spec/
----script_spec.rb
--Rakefile

我的剧本。rb:

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

在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

我该怎么修复它?可能lib文件夹未加载?我是否错过了与Spec语法相关的内容?

xeufq47z

xeufq47z1#

MyGem::OptionParser未在测试中加载。你需要在spec文件中要求它,或者创建一个spec_helper,在这里你需要所有测试中需要的所有文件,所以你只需要在spec中输入require 'spec_helper'
此外,由于您使用的是spec语法,因此必须“require”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

最后,为了使规范正常工作,在script_spec文件的顶部添加require 'spec_helper '。你必须对所有的spec文件都这样做,并确保为你需要加载到spec_helper文件中的所有文件添加require。
因为你也在做规范风格的测试,你可能想把你的测试改为:

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

您也可以在'spec_helper'文件中包含这样的代码,以自动加载lib文件夹中的所有文件:

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

希望这对你有帮助!

c9x0cxw0

c9x0cxw02#

升级到minitest 5.19.0未初始化常量MiniTest(NameError)后,我们收到此错误。Minitest
Minitest 5.19.0默认情况下删除了MiniTest类加载,只有在添加MT_COMPAT变量时才加载,否则我们需要将MiniTest更改为Minitest
https://my.diffend.io/gems/minitest/5.18.1/5.19.0

相关问题