Как издеваться над вложенными сторонними зависимостями? - PullRequest
0 голосов
/ 17 апреля 2020

Пример использования стороннего API:

fund doSomething(api *api.Client) {
    ...
    result, err := api.Logical().Write(val1, val2)
    ...
}

Я могу обработать начальный вызов Logical() с помощью моего собственного интерфейса:

type API interface {
    Logical() *api.Logical
}

...

doSomething(&MockAPI{}) // Assuming MockAPI implements API

Однако теперь это приводит к проблеме зрение: метод Logical() должен иметь указанную выше сигнатуру функции, в противном случае я не смог бы заменить настоящий api объект для моего интерфейса. Поскольку тип *api.Logical вложен в стороннюю библиотеку API, я не могу просто смоделировать его с помощью другого интерфейса:

type Writer interface {
    Write(string, string) Result, error
}

type API interface {
    Logical() *Writer
}

...

doSomething(&api.Client{}) // Doesn't implement Logical() *Writer

Как бы я сменил этот вызов API, чтобы я мог возвращать пользовательские данные, а не ударил живой сервис? Если это помогает, это основано на фактическом API .

1 Ответ

1 голос
/ 17 апреля 2020

Я думаю, что лучший ответ здесь - просто избежать цепного вызова функции.

type Writer interface {
    Write(string, string) Result, error
}

func doSomething(writer Writer) {
    ...
    result, err := writer.Write(val1, val2)
    ...
}

...

doSomething(api.Client.Logical())

Теперь я могу реализовать свой собственный Writer и использовать его для насмешек.

...