最小化未初始化常量误差

问题描述 投票:0回答:2

我尝试使用

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 语法相关的内容?

ruby minitest
2个回答
5
投票

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

此外,由于您使用的是规范语法,因此您必须“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
'。您必须对所有规范文件执行此操作,并确保将规范中需要加载的所有文件的 require 添加到您的 spec_helper 文件中。

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

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

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

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

希望这有帮助!


0
投票

升级到 minitest 5.19.0 后,我们收到此错误未初始化常量 MiniTest (NameError) 您是说吗?迷你测试

Minitest 5.19.0 取消了默认加载 MiniTest 类,只有添加 MT_COMPAT 变量才加载,否则需要将 MiniTest 改为 Minitest

https://my.diffend.io/gems/minitest/5.18.1/5.19.0

© www.soinside.com 2019 - 2024. All rights reserved.