unit-testing之当连接位于结构中时,我应该如何在 Go 中模拟 Redis 连接

thcjp 阅读:38 2025-06-02 22:19:02 评论:0

我正在编写一个处理将一些自定义指标存储到数据存储的 Go 模块。数据的性质使 Redis 非常理想,但使用接口(interface)以防万一需要更改是有意义的。我有以下代码:

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 接口(interface)上定义的函数。这里的问题是,自从 New()函数创建 Redis 客户端并在 MetricsRedisCache 中返回它struct,在为 Put() 编写单元测试时,我无法轻松创建要使用的模拟客户端和 Get()需要 MetricsRedisCache 的函数通过接收器。

请您参考如下方法:

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


标签:Redis
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号