Я пишу Go модуль, который занимается хранением некоторых пользовательских метрик в хранилище данных. Характер данных делает Redis идеальным, но имеет смысл использовать интерфейсы на случай необходимости изменения. У меня есть следующий код:
type MetricsStore interface {
Put(metric string) (string, error)
Get(id string) (string, error)
}
Затем у меня есть структура, которая содержит клиент Redis, и функция New()
, которая создает экземпляр структуры и создает экземпляр клиента Redis, используя параметры, передаваемые в function.
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
через приемник.