当连接位于结构中时,如何在Go中模拟Redis连接?

时间:2020-04-12 21:40:58

标签: unit-testing go redis

我正在编写一个Go模块,该模块负责将一些自定义指标存储到数据存储中。数据的性质使Redis成为理想选择,但是在需要更改的情况下使用接口是有意义的。我有以下代码:

type MetricsStore interface {
    Put(metric string) (string, error)
    Get(id string) (string, error)
}

然后我有一个包含Redis客户端的结构和一个New()函数,该函数创建该结构的实例并使用传递给该函数的参数实例化Redis客户端。

type MetricsRedisCache struct {
    c *redis.Client
}

func New(address string, password string, db int) (MetricsRedisCache) {
    options := &redis.Options{
        Addr:               address,
        Password:           password,
        DB:                 db,
    }

    return RedisUrlStore{client: redis.NewClient(options)}
}
然后,

MetricsRedisCache实现在MetricsStore接口上定义的功能。这里的问题是,由于New()函数创建Redis客户端并将其返回到MetricsRedisCache结构内部,因此我无法轻松地创建模拟客户端以在为{{1 }}和Put()函数使Get()通过接收器。

1 个答案:

答案 0 :(得分:0)

创建一个新的构造器NewWithClient或将客户端作为参数而不是创建它的构造器。然后,它使用给定的客户端返回MetricsRedisCache。您可以在测试中使用此构造函数,以使用模拟Redis客户端执行MetricsRedisCache的逻辑。