
redigomock 默认返回 []byte 类型响应,而 redis.Bool() 和 redis.Int() 等红igo类型转换函数要求底层数据符合协议规范(如 "1" 或 "true" 字节数组),直接传入 Go 原生 bool/int 会导致类型错误;需显式提供符合 Redis 协议序列化格式的 []byte 或 int64 值。
redigomock 默认返回 `[]byte` 类型响应,而 `redis.bool()` 和 `redis.int()` 等红igo类型转换函数要求底层数据符合协议规范(如 `"1"` 或 `"true"` 字节数组),直接传入 go 原生 `bool`/`int` 会导致类型错误;需显式提供符合 redis 协议序列化格式的 `[]byte` 或 `int64` 值。
在使用 redigomock 进行 Redis 客户端逻辑单元测试时,一个常见误区是误以为 .Expect() 方法可直接传入 Go 原生类型(如 true、3)来匹配 redis.Bool() 或 redis.Int() 的解析行为。实际上,redigo 的类型转换函数(如 redis.Bool()、redis.Int())并非直接解包 Go 值,而是解析 Redis 协议层面的响应数据——即 RESP(Redis Serialization Protocol)格式的原始字节。
例如:
- redis.Bool() 期望输入为 []byte("1")、[]byte("true") 或 []byte("0")、[]byte("false")(注意:Redis 本身无布尔类型,EXISTS 返回的是整数 1/0,但 redigo 的 Bool 函数会将 1 视为 true,0 视为 false);
- redis.Int() 期望输入为 []byte("123") 或 int64(123)(redigomock 内部会自动将其编码为 RESP 整数格式)。
因此,以下写法是错误的:
conn.Command("EXISTS", "user_pwf").Expect(true) // ❌ redigomock 无法将 bool 转为合法 RESP 响应
conn.Command("GET", "user_pwf").Expect(3) // ❌ 同样不兼容 redis.Int() 的解析逻辑
✅ 正确做法是:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 对 redis.Bool():使用 []byte("1") 表示 true,[]byte("0") 表示 false;也可用 []byte("true")(redigo 兼容性支持,但推荐用数字更符合 Redis 实际行为);
- 对 redis.Int():直接传入 int64(n)(redigomock 会正确序列化为 RESP 整数);或 []byte("123")(需确保格式为纯数字字符串)。
修正后的测试示例如下:
func TestCheckPasswordFailures_LessThan5(t *testing.T) {
conn := redigomock.NewConn()
// EXISTS 返回 1 → redis.Bool 解析为 true
conn.Command("EXISTS", "user@example.com_pwf").Expect([]byte("1"))
// GET 返回整数 1 → redis.Int 解析为 1
conn.Command("GET", "user@example.com_pwf").Expect(int64(1))
actual := checkPasswordFailures(conn, mockUser)
assert.True(t, actual)
}
⚠️ 注意事项:
- 不要使用 []byte("true") 模拟 EXISTS 响应——虽然 redigo 可能容忍,但 Redis 实际返回的是整数 1 或 0,保持一致性有助于避免环境差异导致的测试漂移;
- 若被测代码调用 redis.String() 或 redis.Bytes(),则 .Expect() 应传入 []byte("value");
- redigomock 的 .Expect() 接受 interface{},内部根据 redigo 类型函数的预期自动适配(如 int64 → RESP integer,[]byte → RESP bulk string),无需手动构造 RESP 帧;
- 建议在测试中覆盖边界场景,例如 EXISTS 返回 0(不存在)、GET 返回 nil(key 不存在)——此时需 .Expect(nil) 并验证错误处理逻辑。
总结:redigomock 的核心原则是 “模拟 Redis 协议响应,而非 Go 值”。理解 redigo 的类型转换机制(redis.Bool() / redis.Int() 等本质是 RESP 解析器),并据此提供符合协议格式的期望值,是写出稳定、可维护 Redis 单元测试的关键。










