我有一个用于在商店中创建零件(产品)的模块,名为ErpPartsService::Builder
,并且在该模块的基础上,我构建了一个辅助类CategoryByLauberIdFetcher
,该类仅在模块内部而不是其他任何地方使用。我将其放在文件app/services/erp_parts_service/builder.rb
中。
这是我的代码:
module ErpPartsService
class CategoryByLauberIdFetcher < Service # This is the helper class that I want to test.
def initialize(...)
...
end
def call(lauber_id:)
...
end
end
class Builder < Service
def initialize(
category_by_lauber_id: CategoryByLauberIdFetcher
)
@category_by_lauber_id = category_by_lauber_id
end
def call(...)
...
end
private
def get_category_by_lauber_id(id)
@category_by_lauber_id.call(lauber_id: id)
end
end
end
我在CategoryByLauberIdFetcher
内为spec/services/erp_parts_service/category_by_lauber_id_fetcher_spec.rb
编写了测试
RSpec.describe ErpPartsService::CategoryByLauberIdFetcher do
it '...' do
...
end
end
运行它们时,我得到:
NameError:
uninitialized constant ErpPartsService::CategoryByLauberIdFetcher
我为Builder
类编写了测试
spec/services/erp_parts_service/builder_spec.rb
RSpec.describe ErpPartsService::Builder do
it '...' do
...
end
end
它们工作正常。我想念什么?
答案 0 :(得分:1)
这看起来像是自动装带器的问题:
自动加载程序看到常量ErpPartsService::Builder
时会期望文件erp_parts_service/builder.rb
并找到它...但是
看到ErpPartsService::CategoryByLauberIdFetcher
自动加载器试图找到erp_parts_service/category_by_lauber_id_fetcher.rb
并失败,因为此类的定义在erp_parts_service/builder.rb
添加require
以显式加载包含您要测试的类的文件。
require 'erp_parts_service/builder.rb'
RSpec.describe ErpPartsService::CategoryByLauberIdFetcher do
it '...' do
...
end
end
或者(更好)将每个类放在单独的文件中并遵守约定。不仅自动装带器,而且其他加入您的项目的人都将在不存在的文件中寻找此类。
我知道您已经提到过您只想在模块内部使用此类,但这并不是将其设为“私有”的方法。您只是讨厌使用它而不是保护它不被使用。