Мне тяжело писать модульные тесты на Go из-за внешних библиотек, которые не предоставляют интерфейс (а значит, не являются поддельными), а только чистые функции. Даже большие, такие как Google не , поэтому мне интересно, достаточно ли хорош мой подход.
Не будет ли хорошей практикой для библиотек предоставлять interface
s вместо пакетов только с функциями, чтобы позволить пользователю издеваться над ними?
Решение, которое я придумал до сих пор, заключается в том, чтобы обернуть эти пакеты реализацией интерфейса, но это кажется слишком большой работой.
Я пришел с примером. Моя функция может выглядеть следующим образом
func AnyFunction() error {
sess := session.Get("blabla")
// logic in here...
}
, где сессия является импортированным пакетом, который возвращает struct
. Я не могу издеваться над посылкой session
.
Для этого случая я напишу SessionInterface
с реализацией, которая внутренне вызывает сессию.
Ex:
type SessionInterface interface {
Get(s string) Session
}
type mySessionImpl struct {}
func (me *mySessionImpl) Get(s string) Session {
return session.Get(s)
}
Теперь для моих тестов я могу смоделировать SessionInterface и вставить его в мой код