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
相关产品推荐
相关产品推荐

