Вы можете создать фиктивный 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()}