Как издеваться над многими URL-адресами, чтобы вернуть содержимое фикстура? - PullRequest
0 голосов
/ 20 февраля 2020

Я пишу какой-то рекурсивный парсер. Простейшая форма:

  1. Возьмите all links из first link тела страницы
  2. Повторите первый шаг для каждой ссылки

Так что теперь Я хочу проверить это. Проблема в том, что я не могу найти лучший способ издеваться над всеми этими страницами. Я использую пакет http, и у меня уже есть несколько тестов, написанных с использованием пакета httptest (через httptest.NewServer). Но это, кажется, не имеет смысла для моей задачи сейчас. Я думаю, что лучший способ - использовать http.Client с пользовательской структурой Transport, но это много шаблонного и дополнительного вонючего кода. Есть ли более элегантный способ сделать это?

1 Ответ

1 голос
/ 20 февраля 2020

Я пару раз использовал пользовательский Transport для тестирования клиентов. Обычно я создавал бы вспомогательные типы и функции для сокращения стандартного кода.

Примерно так могло бы быть началом.

package main

import (
    "bytes"
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    "os"
)

type roundTripFunc func(*http.Request) (*http.Response, error)

func (r roundTripFunc) RoundTrip(req *http.Request) (resp *http.Response, err error) {
    return r(req)
}

func main() {
    c := &http.Client{
        Transport: roundTripFunc(func(req *http.Request) (resp *http.Response, err error) {
            return &http.Response{
                StatusCode: 200,
                Body:       ioutil.NopCloser(bytes.NewBufferString("test")),
            }, nil
        }),
    }

    r, _ := c.Get("/")
    fmt.Printf("%#v\n", r)
    io.Copy(os.Stdout, r.Body)
}

Например, если вы тестируете клиентский API JSON Вы могли бы сделать вспомогательную функцию туда и обратно, заботящуюся о декодировании, кодировании, заголовках и т. д. c. В вашем случае, возможно, вы могли бы сделать заголовок хоста карты функции туда-обратно и URL-путь в пути к файлам?

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