Ruby Minitest运行报uninitialized constant ::ActiveSupport(NameError)如何解决
错误原因
- 你当前是纯Ruby项目,未引入Rails的ActiveSupport依赖包,
ActiveSupport::TestCase是Rails框架提供的测试基类,原生Minitest没有这个类,因此触发未初始化常量的报错。 - 额外问题:你的测试类名称和待测试的业务类完全重名(均为
CreateQuiz),后续实例化业务类时会出现命名冲突问题。 - 额外问题:
test '描述' do是Rails封装的Minitest语法糖,原生Minitest不支持该写法,标准写法为定义以test_开头的实例方法。
修复方案
如果是纯Ruby项目,无需引入额外Rails依赖,按以下步骤修改即可:
- 替换测试类父类:将
ActiveSupport::TestCase改为原生Minitest提供的Minitest::Test - 修改测试类名称:改为
CreateQuizTest避免和业务类重名 - 调整测试用例写法为原生Minitest支持的格式
- 可选适配:如果你的业务解析类返回的是字符串键的哈希,要把
expected_hash的Symbol键:name改为字符串键"name",避免断言失败。
修改后的完整测试代码如下:
# test/src/parsers/incoming_events/create_quiz_test.rb require 'minitest/autorun' require_relative '../../../../src/parsers/incoming_events/create_quiz' module Parsers module IncomingEvents # 改类名避免和业务类冲突,父类替换为Minitest::Test class CreateQuizTest < Minitest::Test # 改用标准的test_前缀方法名 def test_parse_json_to_expected_format assert_equal expected_hash, service.call end private def service @service ||= ::Parsers::IncomingEvents::CreateQuiz.new(payload: payload) end def payload { 'quiz' => { 'first_name' => 'john', 'last_name' => 'doe', 'ssn' => '1234', } }.to_json end def expected_hash # 若业务类返回字符串键,此处改为 "name" => "john doe" { name: 'john doe' } end end end end
如果你的项目本身已经依赖ActiveSupport,只需要在测试文件顶部增加一行require 'active_support/test_case'即可保留原有写法。
内容的提问来源于stack exchange,提问作者mr_muscle
相关产品推荐
相关产品推荐

