dev*_*ush 3 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
}
Run Code Online (Sandbox Code Playgroud)
现在,我想编写的测试非常简单,例如:
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")
}
}
Run Code Online (Sandbox Code Playgroud)
然而,由于我两次调用句柄绑定http,我感到恐慌。
我想我已经找到了一个解决方案:基本上在每次测试后我都重新初始化http.DefaultServeMux,但http.DefaultServeMux = new(http.ServeMux)
我仍然不确定这是解决这个棘手问题的干净方法。
我恳请您给我任何提示或指出这里使用的一些不好的做法,因为我对这门语言和后端开发总体来说还很陌生。我认为上面显示的 HTTP 服务器的配置中可能存在一些代码味道,如果您指出它,我可能会向我的团队的其他成员澄清并制定更好的解决方案。
| 归档时间: |
|
| 查看次数: |
2828 次 |
| 最近记录: |