go之用miniredis模拟redis服务器失败
arxive
阅读:27
2025-06-02 22:19:02
评论:0
这里是 Golang 新手:)
我有一个基于 go-redis 的 redis 客户端包装器,我想测试它是否正常工作。我尝试使用 miniredis 来模拟我要连接的 redis 服务器,但我不断收到错误。
当我将所有内容都放在同一个函数中时,这就可以了 - 我可以针对 miniredis 服务运行 go-redis。但是,当我尝试使用我的客户端时,它失败了。
我尝试查看 go-redis 和 miniredis 的文档,但找不到任何答案。我还尝试过将 miniredis 服务器定义为全局变量,但这也没有帮助。
客户端实现:
package redis
import (
"errors"
"fmt"
"github.com/go-redis/redis"
"go.uber.org/zap"
"os"
"strconv"
"time"
)
var redisClient *redis.Client
var redisCert string
var redisURL = "localhost:6379"
var redisPass = ""
var redisDB = 0
type Client struct {
redisClient *redis.Client
}
func newRedisClient() *Client {
if os.Getenv("REDIS_URL") != "" {
redisURL = os.Getenv("REDIS_URL")
}
if os.Getenv("REDIS_PASS") != "" {
redisPass = os.Getenv("REDIS_PASS")
}
if os.Getenv("REDIS_DB") != "" {
redisDB, _ = strconv.Atoi(os.Getenv("REDIS_DB"))
}
client := redis.NewClient(&redis.Options{
Addr: redisURL,
Password: redisPass,
DB: redisDB,
})
redisClient = client
_, err := redisClient.Ping().Result()
if err != nil {
fmt.Println("Failed to connect", zap.Error(err))
return nil
}
fmt.Println("Redis client is ready")
return &Client{redisClient: client}
}
func (r *Client) Get(key string) (string, error) {
res, err := redisClient.Get(key).Result()
fmt.Println(res, err)
if err == redis.Nil {
return "", errors.New("Key Not Found")
} else if err != nil {
return "", err
} else {
return res, nil
}
}
测试实现:
package redis
import (
"github.com/alicebob/miniredis/v2"
"gopkg.in/go-playground/assert.v1"
"os"
"testing"
)
var mr *miniredis.Miniredis
func TestGet(t *testing.T) {
mr, _ = miniredis.Run()
mr.Set("test1", "some")
os.Setenv("REDIS_URL", mr.Addr())
c := newRedisClient()
r, err := c.Get("test1")
assert.Equal(t, r, "")
assert.Equal(t, err, "")
mr.Close()
}
我做错了什么?
请您参考如下方法:
通过miniredis模拟失败,可以使用SetError: https://github.com/alicebob/miniredis/issues/36#issuecomment-642009898
func TestGet(t *testing.T) {
mr, _ = miniredis.Run()
// normal test
// ...
// error test
mr.SetError("mock error")
_, err = c.Get("test2")
assert.EqualError(t, err, "mock error")
mr.Close()
}
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。



