没有实际文件的模块中的RSpec测试类

时间:2019-10-28 00:59:11

标签: rspec rspec-rails

我有一个用于在商店中创建零件(产品)的模块,名为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

它们工作正常。我想念什么?

1 个答案:

答案 0 :(得分:1)

这看起来像是自动装带器的问题:

  1. 自动加载程序看到常量ErpPartsService::Builder时会期望文件erp_parts_service/builder.rb并找到它...但是

  2. 看到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

或者(更好)将每个类放在单独的文件中并遵守约定。不仅自动装带器,而且其他加入您的项目的人都将在不存在的文件中寻找此类。

我知道您已经提到过您只想在模块内部使用此类,但这并不是将其设为“私有”的方法。您只是讨厌使用它而不是保护它不被使用。