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

