在ruby测试中使用struct生成的匿名类



这里我们有一个struct文件

module CoreDomain
Corporation = Struct.new(...)
end

我们有这样一个测试文件,

require 'test_helper'
module CoreDomain
class CorporationTest < ActiveSupport::TestCase
def test_corporation_struct_creation
corp_struct = CoreDomain::Corporation.new(...)
assert_equal ..., ...
end
end
end

当我试图执行测试时,我得到这个错误。

NameError: uninitialized constant CoreDomain::Corporation

问题-我错在哪里?

我认为你在欺骗自动装填器。

由于您的测试嵌套在module CoreDomain中,当您到达CoreDomain::Corporation.new(...)时,它不会触发自动加载器开始寻找CoreDomain常数。经典的自动装弹机是通过入侵Object.const_missing来工作的,所以很容易出现这类错误。

解决方案是在重新打开模块之前引用常量:

require 'test_helper'
CoreDomain::Corporation # take that you stupid autoloader!
module CoreDomain
class CorporationTest < ActiveSupport::TestCase
def test_corporation_struct_creation
corp_struct = Corporation.new(...)
assert_equal ..., ...
end
end
end

或者直接从模块中删除测试类。

可能有一些误解,但我所需要做的就是添加这一行

require_relative '../../core/domain/corporation.rb'

放到test_corporation.rb文件的顶部

最新更新