ich eine sehr einfache http-Handler haben die Vorlage about.htmlUnittest mit Vorlage golang
func AboutPage(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
template, err := template.ParseFiles("templates/about.html")
if err != nil {
logfile.ErrorMsg(fmt.Sprint(err.Error()))
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
template.Execute(w, nil)
}
dient es funktioniert gut, aber wenn ich will diese Einheit Test auszuführen:
func getRequest(t testing.TB, url string) *http.Request {
req, err := http.NewRequest("GET", url, nil)
if err != nil {
t.Fatal(err)
}
return req
}
func TestAboutPage(t *testing.T) {
r := getRequest(t, "/about")
rw := httptest.NewRecorder()
AboutPage(rw, r, httprouter.Params{})
}
Das Programm Abstürze mit diesem:
go test
--- FAIL: TestAboutPage (0.00s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x41123b4]
goroutine 19 [running]:
panic(0x4417520, 0xc42000c0b0)
/usr/local/go/src/runtime/panic.go:500 +0x1a1
testing.tRunner.func1(0xc42009e180)
/usr/local/go/src/testing/testing.go:579 +0x25d
panic(0x4417520, 0xc42000c0b0)
/usr/local/go/src/runtime/panic.go:458 +0x243
html/template.(*Template).escape(0x0, 0x0, 0x0)
/usr/local/go/src/html/template/template.go:79 +0x44
html/template.(*Template).Execute(0x0, 0x52683b0, 0xc42007a7c0, 0x0, 0x0, 0xc420077290, 0x1)
/usr/local/go/src/html/template/template.go:101 +0x2f
github.com/engineerbeard/engineerbeard.com/httpHandlers.AboutPage(0x45ee2e0, 0xc42007a7c0, 0xc4200ee0f0, 0xc42004bf38, 0x0, 0x0)
/Users/dbubel/gowork/src/github.com/engineerbeard/engineerbeard.com/httpHandlers/handler.go:122 +0xbd
github.com/engineerbeard/engineerbeard.com/httpHandlers.TestAboutPage(0xc42009e180)
/Users/dbubel/gowork/src/github.com/engineerbeard/engineerbeard.com/httpHandlers/handlers_test.go:26 +0x15c
testing.tRunner(0xc42009e180, 0x449b320)
/usr/local/go/src/testing/testing.go:610 +0x81
created by testing.(*T).Run
/usr/local/go/src/testing/testing.go:646 +0x2ec
exit status 2
FAIL github.com/engineerbeard/engineerbeard.com/httpHandlers 0.012s
Wenn ich template.execute() mit einem einfachen Fprintf (w, "foo") der Test ersetzen läuft fi ne. Wie wird das Unittesting mit einer Vorlage durchgeführt?
Vielleicht ist es ein Konflikt zwischen dem Paket und Variablennamen. Versuchen Sie, die Variable von "template" in "t" zu ändern, z. 't, err: = template.ParseFiles (" templates/about.html ") ... t.Execute (w, nil)'. –
Gleiches Ergebnis. Es hat definitiv mit der template.execute zu tun. – stihl
Welche Go-Version verwenden Sie? Ich habe Ihren Code auf go1.7.1 ausgeführt und alles hat gut funktioniert. – danbondd