Вы можете создать интерфейс для функции напрямую, например:
type presigner interface {
Presign(expire time.Duration) (string, error)
}
Если вы реализуете свою логику в отдельной функции, которая принимает presigner
в качестве параметра, подобного этому (называемого внедрение зависимостей ):
func Upload(p presigner, files string) error {
// ...
res, err := p.Presign(someduration)
if err != nil {
return err
}
// and so on
}
Тогда в ваших тестах легко подделать - просто внедрите интерфейс presigner
и получите функцию Presign
, возвращающую то, что вы ожидаете:
type presignerMock struct {}
func (p *presignerMock) Presign(d time.Duration) (string, error) {
return "yay", nil
}
Для тестирования различных сценариев вы можете добавить поля к presignerMock
и вернуть их в свою реализацию:
type presignerMock {
res string
err error
}
func (p *presignerMock) Presign(d time.Duration) (string, error) {
return p.res, p.err
}