dpjtn48868 2016-09-17 05:51
浏览 60
已采纳

使用模板golang进行单元测试

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?

  • 写回答

2条回答 默认 最新

  • duanrao3371 2016-09-18 17:40
    关注

    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...

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 matlab用simulink求解一个二阶微分方程,要求截图
  • ¥30 matlab解优化问题代码
  • ¥15 写论文,需要数据支撑
  • ¥15 identifier of an instance of 类 was altered from xx to xx错误
  • ¥100 反编译微信小游戏求指导
  • ¥15 docker模式webrtc-streamer 无法播放公网rtsp
  • ¥15 学不会递归,理解不了汉诺塔参数变化
  • ¥15 基于图神经网络的COVID-19药物筛选研究
  • ¥30 软件自定义无线电该怎样使用
  • ¥15 R语言mediation包做中介分析,直接效应和间接效应都很小,为什么?