没有 class_name 的 FactoryBot 命名空间模型

Mic*_*ich 5 ruby activerecord ruby-on-rails factory-bot

我有命名空间的模型,例如:

class Vehicle < ActiveRecord::Base; end

class Vehicle::Car < Vehicle; end
class Vehicle::Train < Vehicle; end
class Vehicle::Jet < Vehicle; end
Run Code Online (Sandbox Code Playgroud)

在为这些模型创建工厂时,它们的设置方式如下:

factory :vehicle_car, class: Vehicle::Car do; end
factory :vehicle_train, class: Vehicle::Train do; end
factory :vehicle_jet, class: Vehicle::Jet do; end
Run Code Online (Sandbox Code Playgroud)

这会产生以下弃用警告:

弃用警告:不推荐按类查找工厂,并将在 5.0 中删除。改用符号并设置 FactoryBot.allow_class_lookup = false。

是否有编写符号来命名这些工厂的格式,以便我不需要使用类名来遵守弃用警告?

mu *_*ort 7

该文档对于该: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
Run Code Online (Sandbox Code Playgroud)

key.to_sym一个分支中的 是“我想要一个SymbolString”的惯用语。在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
Run Code Online (Sandbox Code Playgroud)

或者如果你真的想要Symbols(或者有标点符号):

factory :vehicle_car,   class: :'vehicle/car'   do; end
factory :vehicle_train, class: :'vehicle/train' do; end
factory :vehicle_jet,   class: :'vehicle/jet'   do; end
Run Code Online (Sandbox Code Playgroud)


小智 5

您还可以:

factory Vehicle::Car.to_s.underscore.to_sym, class: Vehicle::Car do; end
Run Code Online (Sandbox Code Playgroud)