Тестовый класс RSpec из модуля без фактического файла - PullRequest
0 голосов
/ 28 октября 2019

У меня есть модуль для создания деталей (продуктов) в моем магазине, который называется 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 Ответ

1 голос
/ 30 октября 2019

Похоже, проблема с автозагрузчиком:

  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

Или (еще лучше) поместить каждый класс в отдельный файл и придерживаться соглашения. Не только автозагрузчик, но и другие люди, присоединяющиеся к вашему проекту, будут искать этот класс в несуществующем файле.

Я знаю, вы упомянули, что хотите использовать этот класс только внутри вашего модуля, но это не способ сделать его "закрытым". Вы просто раздражали его использование вместо того, чтобы защищать его от использования.

...