[RSpec测试类,来自没有实际文件的模块

问题描述 投票:0回答:1

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

而且他们工作正常。我想念什么?

rspec rspec-rails
1个回答
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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.