Func

  1. // NewRequest 返回一个新的服务器访问请求,这个请求可以传递给 http.Handler 以便进行测试。
  2. // 如果你想要生成的不是服务器访问请求(请求已经过网络传输并通过路由匹配到达服务端handle),
  3. // 而是一个客户端 HTTP 请求,那么请使用 net/http 包中的 NewRequest 函数。
  4. func NewRequest(method, target string, body io.Reader) *http.Request

type ResponseRecorder

  1. handler := func(w http.ResponseWriter, r *http.Request) {
  2. http.Error(w, "something failed", http.StatusInternalServerError)
  3. }
  4. req, err := http.NewRequest("GET", "http://example.com/foo", nil)
  5. if err != nil {
  6. log.Fatal(err)
  7. }
  8. w := httptest.NewRecorder()
  9. handler(w, req)
  10. fmt.Printf("%d - %s", w.Code, w.Body.String())
  1. type ResponseRecorder struct {
  2. Code int // HTTP回复的状态码
  3. HeaderMap http.Header // HTTP回复的头域
  4. Body *bytes.Buffer // 如非nil,会将Write方法写入的数据写入bytes.Buffer
  5. Flushed bool
  6. // 内含隐藏或非导出字段
  7. }
  8. func NewRecorder() *ResponseRecorder
  9. func (rw *ResponseRecorder) Flush() // Flush将rw.Flushed设置为真。
  10. func (rw *ResponseRecorder) Header() http.Header
  11. func (rw *ResponseRecorder) Result() *http.Response
  12. func (rw *ResponseRecorder) Write(buf []byte) (int, error)
  13. func (rw *ResponseRecorder) WriteHeader(code int)
  14. func (rw *ResponseRecorder) WriteString(str string) (int, error)

type Server

Server是一个HTTP服务端,在本地环回接口的某个系统选择的端口监听,用于点对点HTTP测试。

  1. ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  2. fmt.Fprintln(w, "Hello, client")
  3. }))
  4. defer ts.Close()
  5. res, err := http.Get(ts.URL)
  6. if err != nil {
  7. log.Fatal(err)
  8. }
  9. greeting, err := ioutil.ReadAll(res.Body)
  10. res.Body.Close()
  11. if err != nil {
  12. log.Fatal(err)
  13. }
  14. fmt.Printf("%s", greeting)
  1. type Server struct {
  2. URL string // 格式为http://ipaddr:port,没有末尾斜杠的基地址
  3. Listener net.Listener
  4. // TLS是可选的TLS配置,在TLS开始后会填写为新的配置。
  5. // 如果在未启动的Server调用StartTLS方法前设置,已经存在的字段会拷贝进新配置里。
  6. TLS *tls.Config
  7. // Config可能会在调用Start/StartTLS方法之前调用NewUnstartedServer时被修改。
  8. Config *http.Server
  9. // 内含隐藏或非导出字段
  10. }
  11. // NewServer返回一个新的、已启动的Server。调用者必须在用完时调用Close方法关闭它。
  12. func NewServer(handler http.Handler) *Server
  13. func NewTLSServer(handler http.Handler) *Server
  14. // NewUnstartedServer返回一个新的、未启动的Server。
  15. //在修改其配置后,调用者应该调用Start或StartTLS启动它;调在用完时用者必须调用Close方法关闭它。
  16. func NewUnstartedServer(handler http.Handler) *Server
  17. func (s *Server) Start()
  18. func (s *Server) StartTLS()
  19. func (s *Server) CloseClientConnections() // 关闭当前任何与该服务端建立的HTTP连接。
  20. func (s *Server) Close() // Close关闭服务端,并阻塞到所有该服务端未完成的请求都结束为止。

demo: gin middleware测试

  1. func TestCors(t *testing.T) {
  2. t.Run("without cors middleware", func(t *testing.T) {
  3. r := gin.New()
  4. r.GET("/", func(context *gin.Context) {})
  5. req := httptest.NewRequest("GET", "/", nil)
  6. w := httptest.NewRecorder()
  7. r.ServeHTTP(w, req)
  8. assert.Equal(t, w.Code, 200)
  9. assert.Equal(t, w.Header().Get("Access-Control-Allow-Origin"), "")
  10. assert.Equal(t, w.Header().Get("Access-Control-Allow-Credentials"), "")
  11. assert.Equal(t, w.Header().Get("Access-Control-Allow-Headers"), "")
  12. assert.Equal(t, w.Header().Get("Access-Control-Allow-Methods"), "")
  13. })
  14. t.Run("with cors middleware", func(t *testing.T) {
  15. gin.SetMode(gin.DebugMode)
  16. r := gin.New()
  17. r.Use(Cors())
  18. r.GET("/", func(context *gin.Context) {})
  19. req := httptest.NewRequest("GET", "/", nil)
  20. w := httptest.NewRecorder()
  21. r.ServeHTTP(w, req)
  22. assert.Equal(t, w.Code, 200)
  23. assert.Equal(t, w.Header().Get("Access-Control-Allow-Origin"), "")
  24. assert.Equal(t, w.Header().Get("Access-Control-Allow-Credentials"), "true")
  25. assert.Equal(t, w.Header().Get("Access-Control-Allow-Headers"), "AUTH,CSRF_TOKEN")
  26. assert.Equal(t, w.Header().Get("Access-Control-Allow-Methods"), "POST, GET, OPTIONS,PUT,DELETE")
  27. assert.Equal(t, w.Header().Get("Access-Control-Expose-Headers"), "AUTH,CSRF_TOKEN")
  28. })
  29. }