RSpec中如何在spec_helper.rb为所有示例配置全局before块?
RSpec全局测试前置代码配置方案
完全可以通过spec_helper.rb配置实现跨测试文件、跨describe块的全局用例前置逻辑。你之前认知里before(:each)仅在单个describe块生效,只是因为你把钩子定义在了具体示例组(describe/context块)内部,定义在全局配置块里的before(:each)默认覆盖整个测试套件的所有用例。
具体实现
打开spec_helper.rb,找到RSpec.configure配置块,在块内添加全局before(:each)钩子即可:
RSpec.configure do |config| # 此处代码会在每一个it测试用例执行前运行,不受所属文件、所属describe块限制 config.before(:each) do # 填入需要全局执行的公共逻辑:比如重置全局变量、清理临时数据、初始化通用测试桩等 end end
注意事项
- 作用域逻辑:
before(:each)的生效范围和它的定义位置完全绑定:写在某个describe/context块内,仅作用于该块及其嵌套子块的用例;写在全局RSpec.configure块内,作用于所有被加载到测试套件的用例。 - Rails项目适配:如果是Rails项目,且拆分了
spec_helper.rb(纯Ruby测试通用配置)和rails_helper.rb(依赖Rails环境的测试配置),要覆盖全量测试的话建议把全局钩子写在rails_helper.rb的配置块中——部分Rails相关测试文件可能只引入rails_helper.rb,写在spec_helper.rb里会漏触发。 - 执行顺序:全局
before(:each)优先级最高,最先执行;之后按照describe/context的嵌套层级从外到内依次执行各层定义的before(:each),最后运行用例本身的代码。 - 定向过滤:如果不需要覆盖所有用例,只想给特定类型的测试加前置逻辑,可以给钩子加类型筛选,比如
config.before(:each, type: :model)就只会在所有模型测试用例执行前触发。
内容的提问来源于stack exchange,提问作者Keith Bennett
相关产品推荐
相关产品推荐

