RSpec中allow语句导致it测试块静默终止的原因排查
问题原因分析与修复
你遇到的这个问题核心是语法错误,导致代码提前退出了测试块,具体来说是allow调用里的and return(false)写法不对——RSpec的消息存根方法是and_return(下划线连接),而不是用空格分开的and return。
为什么会出现这种现象?
当你写allow(String).to receive(:broken?).and return(false)时,Ruby会把这个语句解析成:
(allow(String).to receive(:broken?)).and(return(false))
这里的return(false)会直接从当前的it测试块中返回,相当于提前终止了这个测试案例的执行。所以:
puts ":::: AFTER"和后面的expect断言根本没机会运行- 因为测试块没有执行到任何失败的断言,RSpec就认为这个测试通过了,显示“1 example, 0 failures”
不管你是存根存在的方法还是不存在的方法,只要用了and return这种错误写法,都会触发return提前退出,和mocks.verify_partial_doubles或者config.warnings的配置无关。
修复方法
把and return改成RSpec标准的and_return方法即可:
RSpec.describe 'outer' do describe 'inner' do context 'context' do it 'my test' do puts ":::: BEFORE" allow(String).to receive(:broken?).and_return(false) # 这里修复了语法 puts ":::: AFTER" expect(0).to eq(1) # 现在会执行,测试会失败 end end end end
修复后,代码会正常执行到AFTER的打印和expect断言,此时测试会按照预期失败。
内容的提问来源于stack exchange,提问作者user1934428
相关产品推荐
相关产品推荐

