我有这样的命名空间模型:
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。
是否有一种格式可以编写符号来命名这些工厂,以便我不需要使用类名来遵守弃用警告?
该文档对于
: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
您还可以:
factory Vehicle::Car.to_s.underscore.to_sym, class: 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
如果您打算使用符号,
:'Vehicle::Car'
(如其他地方所建议的)或'Vehicle::Car'.to_sym
应该可以工作,尽管我不确定这在测试环境中有多有用。