2017-03-05 118 views
0

在大多数我见过的文档中,大猩猩MUX建议像这样使用...golang大猩猩/ MUX和测试,其中保存的路线

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 
} 

它解决了这个问题,但它使包非常丑陋(与所有_ = m.HandleFunc's)有没有更习惯的方式来做到这一点?

回答

2

您可以使用工厂功能为您的应用程序创建新的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) 
    } 

}