2016-09-17 68 views
1

我有服務模板about.html單元測試與模板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) 
} 

它工作正常,但一個很簡單的HTTP處理程序時,我要運行這個單元測試:

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

} 

程序崩潰,這樣的:

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 

如果我用一個簡單的替換fprintf中template.execute()(W, 「富」)試運行網絡東北。那麼如何用模板完成單元測試?

+0

也許這是包和變量名之間的衝突。嘗試將變量從「模板」更改爲「t」,例如't,err:= template.ParseFiles(「templates/about.html」)... t.Execute(w,nil)'。 –

+0

同樣的結果。它必須與template.execute完全相關。 – stihl

+0

您使用的是哪個版本的Go?我在go1.7.1上運行你的代碼,一切正常。 – danbondd

回答

1

好吧,我想我想通了,我使用

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

爲進口。我跑去安裝在該目錄中,現在它運行...

+0

這將是我的下一個問題 - 我很高興你把它分類! – danbondd