我通常做這樣的事情:
package main
func main(){
db,err := sql.Open(...)
if err != nil {
log.Fatal(err)
}
defer db.Close()
http.HandleFunc("/feed", server.FeedHandler(db))
http.HandleFunc("/gui", server.GuiHandler(db))
...
log.Fatal(http.ListenAndServe(":8000", nil))
}
凡server
是一個單獨的包,我定義,實現和測試我所有的HTTP處理程序。
這基本上是自己所想的,但跳躍包裹在一個結構是沒有必要的分貝的步驟。我會不是建議使db成爲一個全局變量。擁有全局依賴性將徹底摧毀以可靠方式測試您的http處理程序的任何可能性。
注入數據庫的依賴注入,如上例所示,每次調用該函數時都需要輸入兩個額外的字符,但它允許您使用go-sqlmock package輕鬆地測試您的http處理程序,而您必須使用go-sqlmock package作爲您的Web應用程序增長。
package server
func TestFeedHandler(t *testing.T){
mockdb, err := sqlmock.New()
if err != nil {
t.Errorf("An error '%s' was not expected when opening a stub database connection", err)
}
columns := []string{"id", "name"}
sqlmock.ExpectQuery("SELECT id,name from persons;").
WillReturnRows(sqlmock.NewRows(columns).
AddRow(1234, "bob")
handler := FeedHandler(mockdb)
// test that handler returns expected result
}
這個問題似乎真的發表意見的。你問你沒寫過的代碼是否可以工作?有關指南,只需在網上搜索示例即可。最好的問題提供了一個特定的代碼示例,並有一個明確的問題需要解決。 – vastlysuperiorman
大多數框架和示例僅使用全局變量,是的。 – 0x434D53