You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby测试中如何让stub正确返回哈希避免NilClass的each方法报错

报错原因
  • 你编写的Stub正则表达式存在转义错误:%r{\test}中的\t会被Ruby识别为制表符转义序列,根本无法匹配传入的"test"字符串参数,因此调用get("test")时会走到else分支,返回的哈希只有versions2键,没有versions键。业务代码中取env_json['versions']得到nil,调用each方法就触发了NoMethodError。
  • 若业务逻辑中versions预期为数组类型,你当前Stub返回的versions是哈希类型,后续也可能出现逻辑问题,可根据实际业务需求调整返回值结构。
修正方案

直接修正正则表达式即可,若要精确匹配参数也可以改为字符串相等判断,修正后的Stub代码如下:

before(:each) do
  query = double
  allow(query).to receive(:get) do |arg1|
    case arg1.downcase
    # 修正正则转义错误,也可以直接写 when 'test' 做精确匹配
    when %r{test}
     {"versions" => { "flag2" => false } }
    else
     {"versions2" => { "flag2" => true } }
    end
  end
  allow(Chef::ServerAPI).to receive(:new).and_return(query) 
end
可选优化

可以在业务代码中加入空值安全处理,避免后续其他场景下出现同类报错:

# 使用 &. 安全调用符,只有当env_json['versions']不为nil时才会执行each块
env_json['versions']&.each do |name, version|
  # 业务逻辑
end

内容的提问来源于stack exchange,提问作者user5580578

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 18:51:02