как использовать функцию неэкспортированной структуры - PullRequest
1 голос
/ 07 октября 2019

У меня есть пакет, в котором у меня есть неэкспортированная структура и экспортирована новая функция для ее создания и экспортированная функция, которая работает с этой структурой (как рекомендуется, например, здесь: Возвращает неэкспортированный тип из функции ). Если я запускаю функцию в том же месте, где вызывается New, я могу запустить функцию пакета, но я не могу отправить эту сущность другой функции. Каков наилучший способ добиться этого поведения без необходимости иметь весь мой код в одной функции

это, например, работает:

client := package.New()

client.Foo()

, но это не может работать:

client := package.New()

hello(client)


func hello(client interface{}) {

    client.Foo()

}

1 Ответ

1 голос
/ 07 октября 2019

Что действительно необходимо вашей функции hello - это то, что имеет функцию Foo. Вот почему у Go есть интерфейсы. Нет ничего плохого в возврате неэкспортированного типа (на самом деле, это часто и часто правильно). Я бы сделал следующее:

package foobar

// whatever thing that has a Foo function
type FClient interface {
    Foo()
}

func Hello(client FClient) {
    client.Foo() // will work
}

Причина, по которой вы бы сделали это так, заключается в возможности модульного тестирования этого кода:

package foobar_test

import (
    "testing"
)

type testFC struct {
    callCount uint64
}

// implement interface
func (t testFC) Foo() {
    testFC.callCount++
}

func TestHello(t *testing.T) {
    client := testFC{}
    Hello(client)
    if client.callCount != 1 {
        t.Fail("dependency not called")
    }
}

Конечно,для более сложных зависимостей вы бы использовали такие инструменты, как mockgen или тому подобное, но вы поняли идею. По определению, тест UNIT фокусируется на одном коде UNIT. Последнее, что вам нужно сделать, чтобы протестировать модуль пакета, - создать экземпляр типа из другого пакета. Вы должны быть в состоянии высмеивать все, от чего зависит ваш код. Лучший способ сделать это - интерфейсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...