Ruby中如何获取调用require语句的文件路径
获取require调用方文件路径的实现方案
直接在原test_helper.rb文件中通过Ruby内置的调用栈API拿到发起require请求的文件路径,再按路径规则条件加载拆分后的helper文件即可,全程不需要修改任何已有测试文件里的require "test_helper"语句。
核心实现代码
在test_helper.rb的最开头写入以下逻辑,路径判断规则可以根据你项目的实际目录结构调整:
# 拿到直接调用require "test_helper"的文件的绝对路径 caller_path = caller_locations(1, 1).first.absolute_path # 示例规则:单元测试文件存放在test/unit目录,集成测试存放在test/integration目录 if caller_path.include?("/test/unit/") require_relative "unit_test_helper" elsif caller_path.include?("/test/integration/") require_relative "integration_test_helper" else # 兜底逻辑,可根据项目需求配置默认加载项,或抛出异常提示路径不符合规范 require_relative "unit_test_helper" end
注意事项
- 优先用
caller_locations而不是老版本的caller方法:前者是Ruby 2.0+的标准API,性能更高,返回的绝对路径不会出现在不同工作目录下运行时解析错误的问题 - 要是还在使用Ruby 2.0以下的版本,可以用旧写法拿路径:
caller_path = caller.first.split(":").first,不过更建议升级Ruby版本,用官方维护的API更稳妥 - 路径匹配规则完全可以按自己项目的目录结构修改,比如用RSpec的项目一般把单元测试放
spec/unit、集成测试放spec/integration,把判断条件里的路径片段换成自己项目的即可 - 这个方法不绑定任何测试框架,Minitest、RSpec或者其他Ruby测试框架都能正常生效,也不用改测试框架的原有配置
内容的提问来源于stack exchange,提问作者Yann
相关产品推荐
相关产品推荐

