#ruby-on-rails #ruby-on-rails-3 #factory-bot
#ruby-on-rails #ruby-on-rails-3 #factory-бот
Вопрос:
Мой генератор каркасов перестал работать после того, как мы обновили factory girl. Вот почему это произошло. Во-первых, мой конфигурационный файл пытается настроить определенные значения по умолчанию для генерации каркаса, например:
class Application < Rails::Application
config.app_generators do |g|
g.template_engine 'mizugumo:haml'
g.scaffold_controller 'mizugumo:scaffold_controller'
g.assets 'mizugumo:js_assets'
g.test_framework :lrdspec, :fixture => true
g.fixture_replacement 'lrdspec:factory'
g.fallbacks['mizugumo:haml'] = :haml
g.fallbacks[:lrdspec] = :rspec
end
...
end
Где: lrdspec — это имя генератора спецификаций моей компании. Однако самый последний factory_girl_rails в своем инициализаторе грубо принудительно преобразует config.generators.test_framework в ‘test_unit’, если ваша тестовая среда не является точно «: rspec»:
module FactoryGirl
class Railtie < Rails::Railtie
initializer "factory_girl.set_fixture_replacement" do
generators = config.respond_to?(:app_generators) ? config.app_generators : config.generators
if generators.options[:rails][:test_framework] == :rspec
generators.fixture_replacement :factory_girl, :dir => 'spec/factories'
else
generators.test_framework :test_unit, :fixture => false, :fixture_replacement => :factory_girl
end
end
Что я пытаюсь выяснить, как это сделать, так это сгенерировать мой собственный инициализатор, который запускается после инициализатора FG, чтобы установить test_framework обратно в:lrdspec, как я этого хочу.
Я пытался удалить свой собственный raildie в config / initializers или добавить блок в config.after_initialize в config/application.rb и ряд других подходов, но не совсем нашел решение. (Мои знания о последовательности инициализации Rails должны быть немного глубже, чем я думаю).
Спасибо!
Комментарии:
1. Вы смотрели на guides.rubyonrails.org/initialization.html (или railsguts.com/initialization.html для рельсов 2)?
2. Да .. это (и код raildies-3.1.1/lib/rails/initializable.rb — это то, что я читал последние пару часов. Они полезны, но я не вижу (ни из одного источника), как повлиять на порядок созданных инициализаторов.
3. Инициализаторы (например, config/initializers/foobar.rb) загружаются в «алфавитном» порядке. Должно быть довольно легко найти строку кода, которая выполняет фактическую обработку файлов, нет?
Ответ №1:
Хорошо — найдено решение. Иногда просто публикация вопроса может помочь в его обдумывании.
Ответ состоял в том, чтобы установить мой собственный инициализатор в gem, который содержит мой генератор каркасов, и передать:after => «factory_girl.set_fixture_replacement» для инициализации () при создании этого блока. Тот факт, что вы можете указать :after для инициализатора, не задокументирован в документации Rails, но может быть выведен, обнаружив, что Initializable использует TSort для сортировки своей коллекции инициализаторов, исследуя, как работает TSort, и обнаруживая, что сохраненные параметры :after/:before используются в методах, которые вызывает TSortвернуться к.
Итак, исправление состояло в том, чтобы удалить это в конфигурации Raildie для моего собственного gem, который предоставляет генератор каркасов:
initializer "lrd_dev_tools.set_generators", :after => 'factory_girl.set_fixture_replacement' do
generators = config.respond_to?(:app_generators) ? config.app_generators : config.generators
generators.test_framework :lrdspec, :fixture => true
generators.fixture_replacement 'lrdspec:factory'
end