在Go语言中重置HTTP处理程序以进行单元测试

3
我正在测试Golang中的HTTP服务器,除了一个令人烦恼的问题外,一切似乎都很顺利。
在配置服务器之前,在执行`http.ListenAndServe`之前,我使用`http.Handle("/", myrouter)`注册处理程序。然而,在以下测试中,当再次调用配置方法时,会收到以下panic:
``` panic: http: multiple registrations for / [recovered] ```
我想在干净的环境中运行每个测试,但是还没有找到一种方法来拆除`http.DefaultServeMux`。是否有一种方便的方法可以通过“空值”或重新配置测试环境来执行每个测试并在新环境中执行?
package httpserver

import (
    "github.com/gorilla/mux"
    "github.com/private/private/httpserver/rpchandler"
    "net/http"
)

type HTTPServer struct {
    router *mux.Router
    port   int
}

// Config is used to override the default port of the http server.
type Config struct {
    Port *int
}

func NewHTTPServer(config *Config) (*HTTPServer, error) {
    hs := &HTTPServer{
        port: 80,
    }

    // Overwrite default port if passed.
    if config != nil && config.Port != nil {
        hs.port = *config.Port
    }

    err := hs.router = mux.NewRouter().StrictSlash(false)
    if err != nil {
        return nil, err
    }
    // other mux router configs here...

    http.Handle("/", hs.router)

    return hs, nil
}

现在,我想要编写的测试非常简单,比如:

func TestThatServerIsInitializedWithDefaultPort(t *testing.T) {
    sut, _ := NewHTTPServer(nil)

    if sut.port != 80 {
        t.Fatal("default port not configured")
    }

}

func TestThatServerDefaultPortIsOverriddenWithConfig(t *testing.T) {
    mockPort := 8080

    c := Config{
        Port: &mockPort,
    }

    sut, _ := NewHTTPServer(&c)
    if sut.port != 8080 {
        t.Fatal("the port has not been overridden with the one passed in configuration")
    }

}

然而,由于我在http上调用了两次句柄绑定,导致出现了恐慌。


1
你的测试是如何定义的?我们需要一些代码来帮助你。发布设置服务器以及测试处理程序代码。 - shadyyx
抱歉,之前应该先加上一些代码来帮助理解。 - dev_mush
2个回答

5
我想我找到了一个解决方案:每次测试后,我基本上重新初始化 http.DefaultServeMux,使用 http.DefaultServeMux = new(http.ServeMux) 进行初始化。 不过,我仍然不确定这是否是一种优秀的解决方法。
由于我对编程语言和后端开发都比较陌生,所以我请求您给我一些指导或指出我在这里使用的不良做法。我认为上面的HTTP服务器配置可能存在一些代码异味,如果您指出来,我可能会向我的团队明确并找到更好的解决方案。

根据他们的示例,你应该这样做才能选择 gorilla/mux :将其绑定在根上,然后配置 gorilla/mux。具体请参见:https://github.com/gorilla/mux#examples - dev_mush

0

我认为你应该考虑使用httptest pkg。它有一些服务器,你可以在每次测试时重新启动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接