Тестирование http.Pusher и функции push в golang - PullRequest
2 голосов
/ 20 июня 2019

Я пытаюсь написать модульный тест для http.Pusher.Я пытался использовать httptest.NewRecorder () в качестве http.ResponseWriter, но преобразование типов не удалось.Как еще я могу написать тест?

    //My function 
    func push(w http.ResponseWriter, resource string) error {
        pusher, ok := w.(http.Pusher)
        if ok {
            return pusher.Push(resource, nil)
        }
        return fmt.Errorf("Pusher not supported")
    }

    //My test 
    func TestPush(t *testing.T) {
        resource := "static/css/main.css"
        response := httptest.NewRecorder()
        got := push(response, resource)

        if got != nil {
            t.Errorf("Error : %v", got)
        }
    }

Вывод «Pusher не поддерживается», что я предполагаю, что w. (Http.Pusher) не удалось.

1 Ответ

1 голос
/ 20 июня 2019

Вы можете создать фиктивный http.ResponseWriter, который также реализует http.Pusher, и передать его во время тестирования.

Вот простая реализация, которая подходит для вашей тестируемой функции:

type pusher struct {
    http.ResponseWriter
    err    error // err to return from Push()
    target string
    opts   *http.PushOptions
}

func (p *pusher) Push(target string, opts *http.PushOptions) error {
    // record passed arguments for later inspection
    p.target = target
    p.opts = opts
    return p.err
}

Пример тестовой функции:

func TestPush(t *testing.T) {
    resource := "static/css/main.css"
    p := &pusher{}
    err := push(p, resource)

    if err != p.err {
        t.Errorf("Expected: %v, got: %v", p.err, err)
    }
    if resource != p.target {
        t.Errorf("Expected: %v, got: %v", p.target, resource)
    }
}

Обратите внимание, что этот простой pusher встраивает тип http.ResponseWriter, который сам сделает его http.ResponseWriter (он будет pusher реализовать http.ResponseWriter). Во время теста мы оставили это поле nil, потому что функция testtable push() ничего из него не использовала. Если ваша настоящая функция будет вызывать такие методы, как ResponseWriter.Header(), это, конечно, вызовет панику во время выполнения. В этом случае вы также должны указать действительный http.ResponseWriter, например ::1010 *

p := &pusher{ResponseWriter: httptest.NewRecorder()}
...