Skip to content

net/http/httptest: make easier way to create Requests for testing #14915

@encryptio

Description

@encryptio

When http.NewRequest is called, it does not fill in (http.Request).RequestURI, but http.Server does fill in (http.Request).RequestURI, which has caused issues writing tests that use a httptest.ResponseRecorder instead of a httptest.Server.

A test case:

package issue

import (
    "net/http"
    "net/http/httptest"
    "testing"
)

func TestNewRequestRequestURI(t *testing.T) {
    var httpServerRequestURI string
    h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        httpServerRequestURI = r.RequestURI
    })

    srv := httptest.NewServer(h)
    defer srv.Close()

    req, err := http.NewRequest("GET", srv.URL+"/path", nil)
    if err != nil {
        t.Fatal(err)
    }

    newRequestRequestURI := req.RequestURI

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        t.Fatal(err)
    }
    resp.Body.Close()

    if newRequestRequestURI != httpServerRequestURI {
        t.Fatalf("NewRequest().RequestURI = %#v, but sending to server yielded %#v",
            newRequestRequestURI, httpServerRequestURI)
    }
}

Which yields:

--- FAIL: TestNewRequestRequestURI (0.00s)
    test_test.go:33: NewRequest().RequestURI = "", but sending to server yielded "/path"
FAIL
exit status 1
FAIL    issue   0.004s

On go version go1.6 linux/amd64 and go version devel +c12e1b0 Tue Mar 22 17:09:29 2016 +0000 linux/amd64.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions