我正在编写一个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
结构内部,所以我无法轻松地创建模拟客户端,以便为通过接收器接收Put()
的Get()
和MetricsRedisCache
函数编写单元测试。 最佳答案
创建一个新的构造函数NewWithClient
或诸如此类,以客户端作为参数而不是创建它。然后,它使用给定的客户端返回MetricsRedisCache
。您可以在测试中使用此构造函数来使用模拟Redis客户端执行MetricsRedisCache
的逻辑。