当我在测试函数中运行ListenAndServe()时,端口没有关闭,我该如何解决这个问题?

时间:2015-07-31 04:57:46

标签: http go server

当我在测试函数中调用http.ListenAndServe()时,即使在测试完成且进程终止后,端口也不会关闭。因此,下次运行测试时,我会收到错误“ListenAndServe:listen tcp:8080:bind:address is in use”。

当我通过main()正常运行程序时,不会发生这种情况。

func TestIndex(t *testing.T) {
  handle := handlers.ServeAndHandle("8080")
  req, _ := http.NewRequest("GET", "", nil)
  w := httptest.NewRecorder()
  handle.ServeHTTP(w, req)
  if w.Code != http.StatusOK {
      t.Errorf("Home page didn't return %v", http.StatusOK)
  }
}
// this is just a wrapper function of ListenAndServe. m is of type handler
func ServeAndHandle(port string) http.Handler {
  m := &mux{}
  err := http.ListenAndServe(":"+port, m) // set listen port
  if err != nil {
      log.Fatal("ListenAndServe: ", err)
  }
  return m
}

1 个答案:

答案 0 :(得分:0)

您可以使用NewUnstartedServer创建实例,手动启动它,然后在测试结束时推迟关闭它。一些事情:

...
ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {  
    fmt.Fprintln(w, "Hello world")
}))

l, _ := net.Listen("tcp", URL)
ts.Listener = l
ts.Start()
defer ts.Close()

res, err := http.Get(URL)  
if err != nil {
  log.Fatal(err)
} 
...