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

Ruby RSpec测试替身中#<foo>与#[foo]的差异解析及测试失败报错排查求助

解读RSpec测试差异与Ruby对象表示的区别

先直接拆解你遇到的核心问题:

差异含义

测试期望你调用validate_public_address!时传入的第一个参数是RSpec替身对象实例:

#<Double "rec_address">

但实际你传入的是这个替身对象的字符串化版本:

"#[Double \"rec_address\"]"

注意这里的双引号和转义符号——这说明你的代码里把原本的对象转成了字符串,然后把这个字符串传了进去,而不是原对象本身。

# 和 #[foo] 的区别

  • #<Double "rec_address">:这是Ruby对象的默认inspect输出格式,用来表示一个实际存在的对象实例。RSpec的Double(测试替身)实例在被打印时,就会用这种格式展示,告诉你这是一个Double类的对象,标识是"rec_address"。
  • "#[Double \"rec_address\"]":这是把对象转换成字符串后的结果。当你对一个RSpec Double调用to_s,或者把它放进字符串插值(比如"#{rec_address}")时,就会得到类似#[Double "rec_address"]的字符串。而测试日志里的\"是因为RSpec在打印这个字符串时,转义了内部的双引号,方便你看出这是一个字符串类型的值。

问题排查方向

你需要检查lib/magic-admin/resource/token.rb第25行附近的代码:

  • 看看validate_public_address!的第一个参数rec_address是不是被意外做了字符串处理:比如有没有用to_s方法,或者被包裹在字符串插值里,导致对象变成了字符串。
  • 确保传递的是原始的rec_address对象,而不是它的字符串表示。

举个例子,如果你的代码里写了:

validate_public_address!("#{rec_address}", did_token)

就会出现这个问题,改成直接传rec_address即可:

validate_public_address!(rec_address, did_token)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:47:39