Как я должен издеваться над соединением Redis в Go, когда соединение в структуре? - PullRequest
0 голосов
/ 13 апреля 2020

Я пишу 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 через приемник.

1 Ответ

0 голосов
/ 13 апреля 2020

Создайте новый конструктор, NewWithClient или другой, который принимает клиента в качестве параметра вместо его создания. Затем он возвращает MetricsRedisCache с использованием данного клиента. Вы можете использовать этот конструктор в своих тестах для проверки логики c из MetricsRedisCache, используя фиктивный клиент Redis.

...