在golang中重置http处理程序以进行单元测试

时间:2016-11-24 12:31:42

标签: unit-testing http go server

我正在golang中测试一个http服务器,除了一件烦人的事情外,一切看起来都很顺利。

在某些时候,当我配置服务器时,在执行http.ListenAndServe之前我使用http.Handle("/", myrouter)注册一个处理程序,问题是在下面的测试中,当再次调用配置方法时,我收到以下恐慌:

  

恐慌:http:/ [已恢复]

的多次注册

我想在一个干净的环境中运行每个测试,但还没有找到一种方法来拆除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上调用句柄绑定两次,我感到恐慌。

2 个答案:

答案 0 :(得分:2)

我想我找到了一个解决方案:基本上在每次测试后我都会使用http.DefaultServeMux重新初始化http.DefaultServeMux = new(http.ServeMux) 我仍然不确定这是解决问题的一种干净方法。

我恳请您给我任何提示或指出我在这里使用的一些不良做法,因为我对语言很新,并且总体上支持发展。 我认为上面显示的HTTP Server配置中可能存在一些代码异味,如果你指出它我可能会向团队的其他成员说清楚并找到更好的解决方案。

答案 1 :(得分:0)

我认为您应该考虑使用httptest pkg。它有服务器,您可以在每次测试时重新开始。