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

如何使用RSpec测试带控制台输入输出的循环读取方法

问题原因
  • 你的read方法内置死循环,只有输入通过合法性校验才会终止返回。你当前只给gets mock了固定的无效输入,每次循环调用gets都会拿到同一个无效值,永远触发不了返回逻辑,所以进入无限循环。
  • RSpec的output匹配器要求将待执行的逻辑放在expect { }块中才能捕获运行时输出,你用的expect(方法调用)写法会先执行方法再匹配,不符合匹配器要求。
修正方案

修改测试代码如下:

# frozen_string_literal: true

require 'input'
require_relative '../data/messages'
require_relative '../data/rspec'

RSpec.describe Input do
  let(:input) { described_class.new }

  describe '#read' do
    INVALID_INPUTS.each do |invalid_input|
      context "with invalid input \"#{invalid_input}\"" do
        it 'tells user that input is invalid' do
          # 给gets设置两次返回值:第一次是待测无效输入,第二次是合法值用于退出循环
          allow(input).to receive(:gets).and_return(invalid_input, "5.0")
          # 用块形式捕获执行过程的输出,匹配是否包含错误提示
          expect { input.read }.to output(include(INVALID_MSG)).to_stdout
        end
      end
    end
  end
end
补充说明
  • and_return传入多个参数时,gets会按调用顺序依次返回对应值,第二次返回的合法值会让循环终止,避免卡死。
  • 用include(INVALID_MSG)做模糊匹配,可以不用强制匹配方法开头打印的RADIUS_QUERY_MSG内容,只验证错误提示是否正常输出即可,如果你需要精确匹配全量输出,也可以替换为完整的输出字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:06:03