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() 
} 


标签:Redis
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号