Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 用miniredis模拟redis服务器失败_Go_Redis_Go Testing_Go Redis - Fatal编程技术网

Go 用miniredis模拟redis服务器失败

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:

这里是Golang新手:)
我在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()
返回的内容是否相同?