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

Rails 4:如何使用RSpec模拟带自定义响应的异常?

在RSpec中模拟抛出携带自定义内容的异常

首先明确:方法调用要么返回值,要么抛出异常,无法同时完成两者。你需要的是抛出一个携带自定义输出内容的异常,而非同时抛出异常又返回值。实现核心是给自定义异常添加属性,初始化时传入你的error_response,再模拟抛出这个异常实例。

步骤1:确保自定义异常类支持自定义属性

如果User::APIError还未定义或未包含存储自定义内容的属性,先补充:

module User
  class APIError < StandardError
    attr_reader :custom_response

    # 初始化时接收自定义输出对象
    def initialize(custom_response)
      @custom_response = custom_response
      super("API调用失败") # 可选:设置默认错误消息
    end
  end
end

步骤2:在RSpec测试中模拟抛出带自定义内容的异常

先构造你的error_response对象,再实例化异常并模拟抛出:

# 构造任意类型的自定义输出对象(示例用哈希,也可以是自定义类实例)
error_response = { status: 400, error_msg: "非法参数", details: ["缺少用户ID"] }

# 模拟RestClient.post调用时抛出携带自定义内容的异常
allow(RestClient).to receive(:post).and_raise(User::APIError.new(error_response))

步骤3:验证异常及自定义内容

在测试中捕获异常,检查它的自定义属性是否符合预期:

expect { RestClient.post("https://example.com/api", {}) }.to raise_error(User::APIError) do |exception|
  expect(exception.custom_response).to eq(error_response)
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 02:54:37