没有 class_name 的 FactoryBot 命名空间模型

问题描述 投票:0回答:3

我有这样的命名空间模型:

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。

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

ruby-on-rails ruby activerecord factory-bot
3个回答
11
投票

该文档对于

: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

5
投票

您还可以:

    factory Vehicle::Car.to_s.underscore.to_sym, class: Vehicle::Car { }

1
投票

您可以只使用字符串形式的完全限定类名:

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

如果您打算使用符号,

:'Vehicle::Car'
(如其他地方所建议的)或
'Vehicle::Car'.to_sym
应该可以工作,尽管我不确定这在测试环境中有多有用。

© www.soinside.com 2019 - 2024. All rights reserved.