Модели пространства имен FactoryBot без имени_класса - PullRequest
0 голосов
/ 20 мая 2018

У меня есть модели с пространством имен, такие как это:

class Vehicle < ActiveRecord::Base; end

class Vehicle::Car < Vehicle; end
class Vehicle::Train < Vehicle; end
class Vehicle::Jet < Vehicle; end

При создании заводов для этих моделей они были настроены следующим образом:

factory :vehicle_car, class: Vehicle::Car do; end
factory :vehicle_train, class: Vehicle::Train do; end
factory :vehicle_jet, class: Vehicle::Jet do; end

Это производитследующее предупреждение об устаревании:

ПРЕДУПРЕЖДЕНИЕ ОБ УСТАРЕВАНИИ: Поиск заводов по классам устарел и будет удален в 5.0.Вместо этого используйте символы и задайте FactoryBot.allow_class_lookup = false.

Существует ли формат записи символа для именования этих фабрик, чтобы мне не приходилось использовать имя класса для соответствия предупреждению об устаревании?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Также вы можете:

factory Vehicle::Car.to_s.underscore.to_sym, class: Vehicle::Car do; end
0 голосов
/ 20 мая 2018

Документация не очень полезна в отношении того, как ведет себя опция :class или что она ожидает в качестве значения, но источник был более полезным.Возвращаясь к сообщению об ошибке, мы находим FactoryBot::Decorator::ClassKeyHash#symbolize_keys:

def symbolized_key(key)
  if key.respond_to?(:to_sym)
    key.to_sym
  elsif FactoryBot.allow_class_lookup
    ActiveSupport::Deprecation.warn "Looking up factories by class is deprecated and will be removed in 5.0. Use symbols instead and set FactoryBot.allow_class_lookup = false", caller
    key.to_s.underscore.to_sym
  end
end

. key.to_sym в первой ветви - это обычное выражение для "Я хочу Symbol или String».key.to_s.underscore.to_sym во второй ветви сообщает нам, какой формат ожидается.

Если вы запустите Vehicle::Car - to_s.underscore, вы получите 'vehicle/car', поэтому они должны работать:

factory :vehicle_car,   class: 'vehicle/car'   do; end
factory :vehicle_train, class: 'vehicle/train' do; end
factory :vehicle_jet,   class: 'vehicle/jet'   do; end

или если вы действительно хотите Symbol с (или есть пунктуация):

factory :vehicle_car,   class: :'vehicle/car'   do; end
factory :vehicle_train, class: :'vehicle/train' do; end
factory :vehicle_jet,   class: :'vehicle/jet'   do; end
...