Пользовательский Rails инициализатор как класс - PullRequest
0 голосов
/ 19 марта 2020

У меня есть инициализатор для загрузки некоторых данных из CSV-файла в глобальную переменную, которая будет использоваться в модели. Прямо сейчас это выглядит так:

...
XYZ = Hash[*CSV.open...]

Теперь я хочу написать rspe c spe c для этого инициализатора. Я использую rubocop-rspec, и он говорит, что describe должен принимать не строку, а класс или модуль (https://www.rubydoc.info/gems/rubocop-rspec/1.1.0/RuboCop/Cop/RSpec/DescribeClass).

Предполагая, что это разумно Какие есть варианты для преобразования инициализатора в класс?

Есть опция для использования describe XYZ, но она кажется неправильной.

1 Ответ

1 голос
/ 19 марта 2020

1) Ну, вы могли бы обернуть Hash[*CSV.open...] в некоторый вспомогательный класс или модуль, скажем, DataLoader, покрыть его тестами и затем вызвать как XYZ = DataLoader.do_stuff(filename) в вашем инициализаторе.

Но есть один «недостаток» при таком подходе: класс будет действительно «тупым» (без добавления пользовательских логи c вообще, просто обернув пару методов из stdlib) и будет использоваться в только инициализатор - так будет называться только один раз . Я сомневаюсь, что все эти дополнительные шаблоны стоят того.

Итак, я бы, наверное, подумал о чем-то попроще:

2) Просто проигнорируйте (отключите) этого конкретного полицейского для этого конкретного случая. Соглашения хороши, а rubocop просто великолепны, но иногда нарушение правил приводит к более чистому коду, чем слепое следование им. Например, я иногда добавляю тесты для деструктивных рейковых задач - в этом случае мне тоже приходится нарушать это соглашение, и я делаю это, когда это необходимо, потому что это все же лучше, чем искусственные обходные пути ради соглашений ... Нужно протестировать второстепенный кусок логики инициализатора c? Просто сделай это:)

...