2

I have a very simple http handler serving the template about.html

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) } 

It works fine, but when i want to run this unit test:

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{}) } 

The program crashes with this:

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 

If i replace template.execute() with a simple Fprintf(w, "foo") the test runs fine. So how is unittesting done with a template?

4
  • Maybe it's a conflict between the package and variable names. Try changing the variable from template to t, e.g. t, err := template.ParseFiles("templates/about.html") ... t.Execute(w, nil). Commented Sep 17, 2016 at 8:10
  • Same result. It has to do with the template.execute all definitely. Commented Sep 17, 2016 at 15:31
  • Which version of Go are you using? I ran your code on go1.7.1 and everything worked fine. Commented Sep 18, 2016 at 7:38
  • @danbondd I am on 1.7. Can you send the code you used to ran? And you ran it using "go test" ? Commented Sep 18, 2016 at 15:18

2 Answers 2

2

Ok i think i figured it out, i'm using

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

as an import. I ran go install in that directory and now it runs...

Sign up to request clarification or add additional context in comments.

1 Comment

This was going to be my next question - I'm glad you got it sorted!
1

It can be solved if you add absolute path in this line template, err := template.ParseFiles("absolutePathOfTheFile")

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.