gpt4 book ai didi

go - 使用miniredis模拟Redis服务器失败

转载 作者:行者123 更新时间:2023-12-01 22:24:47 24 4
gpt4 key购买 nike

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

我究竟做错了什么?

最佳答案

抱歉,花了很长时间才得到答复。我已经在本地运行您的代码,但没有收到错误消息。

普通文件

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

关于go - 使用miniredis模拟Redis服务器失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60730639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com