2016-09-17 4 views
1

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?

+0

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)'. –

+0

Gleiches Ergebnis. Es hat definitiv mit der template.execute zu tun. – stihl

+0

Welche Go-Version verwenden Sie? Ich habe Ihren Code auf go1.7.1 ausgeführt und alles hat gut funktioniert. – danbondd

Antwort

1

Ok ich glaube, ich es herausgefunden, ich bin mit

_ "github.com/mattn/go-sqlite3" 

als Import. Ich rannte gehen in diesem Verzeichnis installieren und jetzt läuft es ...

+0

Das sollte meine nächste Frage sein - ich bin froh, dass du es sortiert hast! – danbondd