为了账号安全,请及时绑定邮箱和手机立即绑定

使用 miniredis 模拟 redis 服务器失败

使用 miniredis 模拟 redis 服务器失败

Go
蓝山帝景 2022-05-23 15:38:47
Golang 新手在这里 :)我在 go-redis 上有一个 redis 客户端包装器,我想测试它是否正常工作。我曾尝试使用 miniredis 来模拟我将要连接的 redis 服务器,但我不断收到错误消息。当我将所有东西都放在同一个函数中时,它就可以工作了——我可以针对 miniredis 服务运行 go-redis。但是,当我尝试使用我的客户端时,它失败了。我试过查看 go-redis 和 miniredis 的文档,但找不到任何答案。我也尝试过将 miniredis 服务器定义为全局变量,但这也无济于事。客户端实现:package redisimport (    "errors"    "fmt"    "github.com/go-redis/redis"    "go.uber.org/zap"    "os"    "strconv"    "time")var redisClient *redis.Clientvar redisCert stringvar redisURL = "localhost:6379"var redisPass = ""var redisDB = 0type 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 redisimport (    "github.com/alicebob/miniredis/v2"    "gopkg.in/go-playground/assert.v1"    "os"    "testing")var mr *miniredis.Miniredisfunc 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()}我究竟做错了什么?
查看完整描述

2 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

通过 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()

}


查看完整回答
反对 回复 2022-05-23
?
湖上湖

TA贡献2003条经验 获得超2个赞

我已在本地运行您的代码,但没有收到错误消息。


普通文件


package redis


import (

    "errors"

    "fmt"

    "os"

    "strconv"


    "github.com/go-redis/redis"

    "go.uber.org/zap"

)


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

    if err == redis.Nil {

        return "", errors.New("Key Not Found")

    } else if err != nil {

        return "", err

    } else {

        return res, nil

    }


}

测试文件


package redis


import (

    "fmt"

    "os"

    "testing"


    "github.com/alicebob/miniredis/v2"

)


var mr *miniredis.Miniredis


func TestGet(t *testing.T) {

    var err error


    mr, err = miniredis.Run()

    fmt.Printf("Run err: %v\n", err)

    fmt.Printf("mr.Addr(): %v\n", mr.Addr())


    err = mr.Set("test1", "some")

    fmt.Printf("Set err: %v\n", err)


    err = os.Setenv("REDIS_URL", mr.Addr())

    fmt.Printf("Setenv err: %v\n", err)


    c := newRedisClient()

    r, err := c.Get("test1")


    fmt.Printf("Get err: %v\n", err)

    fmt.Printf("r: %v\n", r)


    mr.Close()

}

结果


go test

Run err: <nil>

mr.Addr(): 127.0.0.1:54966

Set err: <nil>

Setenv err: <nil>

Redis client is ready

Get err: <nil>

r: some

PASS

ok      test/sof        0.536s


查看完整回答
反对 回复 2022-05-23
  • 2 回答
  • 0 关注
  • 267 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信