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

