Go 用miniredis模拟redis服务器失败
这里是Golang新手:)Go 用miniredis模拟redis服务器失败,go,redis,go-testing,go-redis,Go,Redis,Go Testing,Go Redis,这里是Golang新手:) 我在go redis上有一个redis客户端包装器,我想测试它是否正常工作。我曾尝试使用miniredis来模拟我将要连接的redis服务器,但我一直收到一个错误 当我把所有东西都放在同一个函数中时,这就起作用了——我可以在miniredis服务上运行go redis。但是,当我尝试使用我的客户端时,它失败了。 我试着查看go redis和miniredis的文档,但找不到任何答案。我还尝试将miniredis服务器定义为一个全局变量,但也没有帮助 客户端impl:
我在go redis上有一个redis客户端包装器,我想测试它是否正常工作。我曾尝试使用miniredis来模拟我将要连接的redis服务器,但我一直收到一个错误 当我把所有东西都放在同一个函数中时,这就起作用了——我可以在miniredis服务上运行go redis。但是,当我尝试使用我的客户端时,它失败了。
我试着查看go redis和miniredis的文档,但找不到任何答案。我还尝试将miniredis服务器定义为一个全局变量,但也没有帮助 客户端impl:
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
}
}
测试impl:
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()
}
我做错了什么?很抱歉花了这么长时间才得到答复。我已经在本地运行了您的代码,没有收到任何错误 普通文件
包redis
进口(
“错误”
“fmt”
“操作系统”
“strconv”
“github.com/go-redis/redis”
“go.uber.org/zap”
)
var redisClient*redis.Client
var redisCert字符串
var redisURL=“localhost:6379”
var redisPass=“”
var redisDB=0
类型客户端结构{
redisClient*redis.Client
}
func newRedisClient()*客户端{
如果os.Getenv(“REDIS_URL”)!=“”{
redisURL=os.Getenv(“REDIS\uURL”)
}
如果os.Getenv(“REDIS_PASS”)!=“”{
redisPass=os.Getenv(“REDIS\u PASS”)
}
如果os.Getenv(“REDIS_DB”)!=“”{
redisDB,=strconv.Atoi(os.Getenv(“REDIS_DB”))
}
client:=redis.NewClient(&redis.Options){
地址:redisURL,
密码:redisPass,
DB:redisDB,
})
redisClient=client
_,err:=redisClient.Ping().Result()
如果错误!=零{
fmt.Println(“连接失败”,zap.Error(错误))
归零
}
fmt.Println(“Redis客户端已准备就绪”)
返回&客户端{redisClient:Client}
}
func(r*客户端)Get(键字符串)(字符串,错误){
res,err:=redisClient.Get(key.Result())
如果err==redis.Nil{
返回“”,错误。新建(“未找到密钥”)
}否则,如果错误!=零{
返回“”,错误
}否则{
返回res,无
}
}
测试文件
包redis
进口(
“fmt”
“操作系统”
“测试”
“github.com/alicebob/miniredis/v2”
)
var mr*miniredis.miniredis
func TestGet(t*testing.t){
变量错误
mr,err=miniredis.Run()
fmt.Printf(“运行错误:%v\n”,错误)
fmt.Printf(“mr.Addr():%v\n”,mr.Addr())
err=mr.Set(“test1”、“some”)
fmt.Printf(“设置错误:%v\n”,错误)
err=os.Setenv(“REDIS_URL”,mr.Addr())
fmt.Printf(“设置环境错误:%v\n”,错误)
c:=newRedisClient()
r、 err:=c.Get(“test1”)
fmt.Printf(“获取错误:%v\n”,错误)
fmt.Printf(“r:%v\n”,r)
克洛斯先生()
}
结果
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测试
运行错误:
Addr先生():127.0.0.1:54966
设置错误:
设置环境错误:
Redis客户端已经准备好了
获取错误:
r:一些
通过
正常测试/sof 0.536s
模拟通过miniredis失败,您可以使用SetError
:
func TestGet(t*testing.t){
mr,u=miniredis.Run()
//正常试验
// ...
//错误测试
SetError先生(“模拟错误”)
_,err=c.Get(“test2”)
assert.EqualError(t,err,“模拟错误”)
克洛斯先生()
}
你到底得到了什么错误?@minitauros我得到的错误是EOF。确保连接的ping调用返回以下日志错误:未能连接{“服务”:“redis”,“error”:“EOF”}
如果您确实将代码从TestGet
移动到newRedisClient
函数中,它会工作吗?是的。如果miniredis是在调用它的同一个函数中启动的,它会工作。您是否调试并找到了连接到的redisURL
的值?newRedisClient
和TestGet()
中的mr.Addr()
返回的内容是否相同?