Как смоделировать запрос. Запрос в Голанге - PullRequest
0 голосов
/ 21 января 2019

Я использую github.com/aws/aws-sdk-go/aws/request для получения предопределенных URL-адресов, которые мне нужны для загрузки файлов в корзину s3 в AWS. Я сейчас пишу тест, для этого мне нужно издеваться func (r *Request) Presign(expire time.Duration). request.Request - это структура, а не интерфейс, поэтому я понятия не имею, как я могу ее высмеять.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вы можете создать интерфейс для функции напрямую, например:

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
}
0 голосов
/ 21 января 2019

Это не дает прямого ответа на ваш вопрос, но может полностью убрать суть вопроса.

Отличная вещь в Go - то, что вы можете легко изолировать свои зависимости с помощью интерфейсов.Если ваш код, часть, которую вам нужно протестировать, использует Presign косвенно, тестировать тривиально.

Т.е. создать интерфейс

type HigherLevelAws interface {
    Upload(file string) error
}

и использовать этот интерфейс в своемкод вместе с Upload.Затем вы можете легко смоделировать это, используя, например, https://godoc.org/github.com/stretchr/testify/mock

Реальная реализация будет выглядеть примерно так

type ActualAwsImpl struct {
    aws *aws.Client
}

func (a *ActualAwsImpl) Upload(file string) error {
    aws.Presign...
}

Это позволяет вам тестировать бизнес-часть вашего кода, но, конечно,, все еще оставляет непроверенный код в ActualAwsImpl.Однако этот непроверенный код может гарантированно работать благодаря модульным и интеграционным тестам в самом aws sdk.В любом случае, в моей организации мы проверяем это, используя поддельные сервисы aws, запускаемые в Docker (например, https://github.com/gliffy/fake-s3).

...