golang gorilla/mux和测试,在哪里存储路线
在我看到的大多数文档中,建议像这样使用gorilla muxgolang gorilla/mux和测试,在哪里存储路线,go,Go,在我看到的大多数文档中,建议像这样使用gorilla mux func main() { m := mux.Router() m.HandleFunc("/", FuncNameOrDef) http.ListenAndServe(":8080", m) } 这很好,但这给我留下了一个问题,因为为了测试,据我所知,我需要重新声明mux和路由,除非我在像这样的函数之外声明mux和路由 var ( m = mux.Router() _ = m.HandleF
func main() {
m := mux.Router()
m.HandleFunc("/", FuncNameOrDef)
http.ListenAndServe(":8080", m)
}
这很好,但这给我留下了一个问题,因为为了测试,据我所知,我需要重新声明mux和路由,除非我在像这样的函数之外声明mux和路由
var (
m = mux.Router()
_ = m.HandleFunc("/", FuncNameOrDef)
)
然后在我的测试中这样做
func TestSomeView(t *testing.T) {
ts := httptest.NewServer(m)
....testing blah
}
这就解决了问题,但是它会让包变得非常难看(使用所有的
\uu=m.HandleFunc
),有没有更惯用的方法来实现这一点 可以使用工厂函数为应用程序创建新的http.Handler
。这将允许您以编程方式定义处理程序并在测试中重用它们
// NewApplicationHandler provides a configured handler for the
// application.
func NewApplicationHandler() http.Handler {
mux := mux.NewRouter()
mux.HandleFunc("/", handler)
return mux
}
func handler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World!"))
}
此示例将用于以下测试:
func TestApplicationServeMux(t *testing.T) {
// The handlers are being obtained via a call to the factory function.
applicationHandler := NewApplicationHandler()
ts := httptest.NewServer(applicationHandler)
defer ts.Close()
res, err := http.Get(ts.URL)
if err != nil {
t.Fatalf("%s", err)
}
defer res.Body.Close()
greeting, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatalf("%s", err)
}
want := []byte("Hello World!")
if !bytes.Equal(want, greeting) {
t.Errorf("Expected greeting %s; got %s", want, greeting)
}
}
您可以使用工厂函数为您的应用程序创建一个新的
http.Handler
。这将允许您以编程方式定义处理程序并在测试中重用它们
// NewApplicationHandler provides a configured handler for the
// application.
func NewApplicationHandler() http.Handler {
mux := mux.NewRouter()
mux.HandleFunc("/", handler)
return mux
}
func handler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World!"))
}
此示例将用于以下测试:
func TestApplicationServeMux(t *testing.T) {
// The handlers are being obtained via a call to the factory function.
applicationHandler := NewApplicationHandler()
ts := httptest.NewServer(applicationHandler)
defer ts.Close()
res, err := http.Get(ts.URL)
if err != nil {
t.Fatalf("%s", err)
}
defer res.Body.Close()
greeting, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatalf("%s", err)
}
want := []byte("Hello World!")
if !bytes.Equal(want, greeting) {
t.Errorf("Expected greeting %s; got %s", want, greeting)
}
}