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

