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

Go语言中redismock如何匹配动态OTP(类似testify的mock.Anything)

解决go-redis/redismock匹配动态OTP的问题

针对动态生成的OTP无法固定值匹配的问题,有以下几种实用方案:

1. 使用redismock内置的任意值匹配器

直接用redismock.Any()作为ExpectSet的第二个参数,就能匹配任何动态生成的OTP值,示例代码:

suite.mockRedis.ExpectSet(repotest.DummyUser.PhoneNumber, redismock.Any(), ttl).SetVal("")

这里SetVal的返回值可以留空或随便填,测试核心是验证Redis的Set命令被正确调用(手机号、TTL参数符合预期),无需关注具体OTP值。

2. 自定义匹配器验证OTP格式

如果需要确保存入的OTP符合业务规则(比如必须是6位数字),可以自定义redis.ValueMatcher来做校验,示例:

import "strconv"

// 自定义匹配器:校验OTP是6位数字
otpMatcher := redis.ValueMatcher(func(v interface{}) bool {
    otpStr, ok := v.(string)
    if !ok || len(otpStr) != 6 {
        return false
    }
    _, err := strconv.Atoi(otpStr)
    return err == nil
})

suite.mockRedis.ExpectSet(repotest.DummyUser.PhoneNumber, otpMatcher, ttl).SetVal("")

这种方式既能匹配动态值,又能保证OTP符合业务格式要求。

3. 直接使用testify的mock.Anything

如果你习惯用testify的mock.Anything,可以直接将它作为参数传入ExpectSet,redismock兼容testify的匹配器类型,示例:

import "github.com/stretchr/testify/mock"

suite.mockRedis.ExpectSet(repotest.DummyUser.PhoneNumber, mock.Anything, ttl).SetVal("")

这样就能用你熟悉的方式实现任意值匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:59:59