RSpec测试块重复执行:expect语句引发多次运行的解决方法
解决RSpec测试因expect断言导致重复执行的问题
核心原因
你的测试重复执行大概率是因为引入了rspec-retry这类第三方gem——它会自动重试失败的测试用例。你写的expect([1,23]).to eq([1,22])是个必然失败的断言,这类gem默认会重试2次,加上第一次执行,就会出现3次"hello world"的输出。RSpec本身默认没有重试机制,所以不用怀疑是框架本身的问题。
具体解决步骤
全局禁用重试
打开spec_helper.rb或rails_helper.rb,找有没有类似下面的配置,直接注释或删除:require 'rspec/retry' RSpec.configure do |config| config.default_retry_count = 2 # 就是这个配置控制重试次数 config.verbose_retry = true end单个测试禁用重试
如果不想全局关掉重试,只针对这个测试禁用,可以给测试块加标签:it "returns true", retry: 0 do test_user = create(:user) puts "hello world" # jsonapi_get "/my_api_url" expect([1,23]).to eq([1,22]) end排查其他自定义逻辑
检查有没有自己写的RSpec钩子(比如around(:each))里加了重试代码,或者CI工具的插件自动开启了重试,找到后调整或移除相关逻辑即可。
验证
修改完重新跑测试,要是"hello world"只打印1次,不管断言成功还是失败都不再重复执行,就说明问题解决了。
内容的提问来源于stack exchange,提问作者mrateb
相关产品推荐
相关产品推荐

