测试期间如何关闭Friendly_id或其History模块以提升性能?
解决Friendly_id在Rails测试中的性能问题
针对你遇到的测试性能下降问题,完全可以临时关闭slug生成或History模块,以下是几种实用方案:
动态切换Friendly_id配置
在模型里根据测试场景调整配置,默认关闭slug生成和History,仅在需要的测试中启用:
include FriendlyId if Rails.env.test? && !Thread.current[:enable_friendly_id_history] # 测试环境默认禁用slug生成与History friendly_id :generate_slug, use: [] else friendly_id :generate_slug, use: [:slugged, :history] end
然后在需要History追踪的单个测试中开启:
test "需要History追踪的业务逻辑" do Thread.current[:enable_friendly_id_history] = true # 编写你的测试代码 ensure Thread.current[:enable_friendly_id_history] = nil # 测试后清理状态 end
测试环境单独重载模型配置
在测试支持文件中默认关闭Friendly_id的slug和History功能,按需启用:
- 创建
test/support/repeater_friendly_id_override.rb:
Repeater.class_eval do remove_friendly_id friendly_id :generate_slug, use: [] end
- 在
test_helper.rb中引入该文件,让所有测试默认禁用相关功能; - 在需要的测试中重新开启:
test "需要History追踪的测试" do Repeater.class_eval do remove_friendly_id friendly_id :generate_slug, use: [:slugged, :history] end # 测试逻辑 ensure # 测试结束后恢复默认配置 Repeater.class_eval do remove_friendly_id friendly_id :generate_slug, use: [] end end
跳过slug生成回调
如果只是想避免生成slug,创建记录时直接跳过对应的回调:
# 不生成slug快速创建记录 repeater = Repeater.new(你的记录属性) repeater.save(validate: false, skip_callback: :save, name: :set_slug)
注:不同版本的Friendly_id回调名称可能略有差异,需根据实际版本调整。
内容的提问来源于stack exchange,提问作者Pablo Fernandez
相关产品推荐
相关产品推荐

