Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
golang gorilla/mux和测试,在哪里存储路线_Go - Fatal编程技术网

golang gorilla/mux和测试,在哪里存储路线

golang 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

在我看到的大多数文档中,建议像这样使用gorilla 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
}

这就解决了问题,但是它会让包变得非常难看(使用所有的
\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)
    }

}