Да, я знаю, что могу использовать load
вместо require
. Но это нехорошее решение для моего варианта использования:Есть ли способ принудительно перезагрузить требуемый файл в Ruby?
Когда приложение загружается, оно requires
конфигурационный файл. Каждая среда имеет свою собственную конфигурацию. Конфигурация устанавливает константы.
Когда приложение загружается, требуется только одно окружение. Однако во время тестирования он загружает файлы конфигурации несколько раз, чтобы убедиться, что нет синтаксических ошибок.
В тестовой среде один и тот же файл конфигурации может быть загружен более одного раза. Но я не хочу менять require
на загрузку, потому что каждый раз, когда выполняется спецификация, он перезагружает конфигурацию. Это должно быть сделано через require
, потому что, если конфигурация уже загружена, она вызывает предупреждения already initialized constant
.
Чистое решение, которое я вижу, - это вручную сбросить флаг require для конфигурационного файла после любой конфигурации.
Есть ли способ сделать это в Ruby?
Редактировать: добавить код.
Когда приложение загружается она вызывает файл инициализации:
init.rb:
require "./config/environments/#{ ENV[ 'RACK_ENV' ]}.rb"
config/environments/test.rb:
APP_SETTING = :foo
config/environments/production.rb:
APP_SETTING = :bar
spec/models/config.rb: # It's not a model spec...
describe 'Config' do
specify do
load './config/environments/test.rb'
end
specify do
load './config/environments/production.rb'
end
Вы понимаете, что причина, по которой вы не получаете «уже инициализированную константу» из 'require' is *, потому что * она пропускает загрузку файла. Это не любое другое свойство 'require', которое предотвращает предупреждение - если вы найдете способ переустановить флаг require, то вы * будете получать предупреждения о константах, точно так же, как использовать' load'. –
Да, я знаю. 'Object.send: remove_const, const, если Object.const_defined? const' –
Если вы сделаете это в сочетании с 'load', это решит вашу проблему? Если нет, почему бы и нет? Единственное возражение против «загрузки», которое я понимаю в вашем вопросе, - это предупреждения «уже инициализированные константы» - если есть еще одна причина, по которой вы не можете использовать 'load' в своих спецификациях, я не понимаю, что это такое? –