我有一个用于在商店中创建零件(产品)的模块,名为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
而且他们工作正常。我想念什么?
似乎是自动装带器的问题:
看到常量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
或者(更好的是)将每个类放在单独的文件中并遵守约定。不仅自动装带器,而且其他加入您的项目的人都将在不存在的文件中寻找此类。
我知道您已经提到过您只想在模块内部使用此类,但这并不是使它成为“私有”方法。您只是讨厌使用它而不是保护它不被使用。