Func
// NewRequest 返回一个新的服务器访问请求,这个请求可以传递给 http.Handler 以便进行测试。// 如果你想要生成的不是服务器访问请求(请求已经过网络传输并通过路由匹配到达服务端handle),// 而是一个客户端 HTTP 请求,那么请使用 net/http 包中的 NewRequest 函数。func NewRequest(method, target string, body io.Reader) *http.Request
type ResponseRecorder
handler := func(w http.ResponseWriter, r *http.Request) {http.Error(w, "something failed", http.StatusInternalServerError)}req, err := http.NewRequest("GET", "http://example.com/foo", nil)if err != nil {log.Fatal(err)}w := httptest.NewRecorder()handler(w, req)fmt.Printf("%d - %s", w.Code, w.Body.String())
type ResponseRecorder struct {Code int // HTTP回复的状态码HeaderMap http.Header // HTTP回复的头域Body *bytes.Buffer // 如非nil,会将Write方法写入的数据写入bytes.BufferFlushed bool// 内含隐藏或非导出字段}func NewRecorder() *ResponseRecorderfunc (rw *ResponseRecorder) Flush() // Flush将rw.Flushed设置为真。func (rw *ResponseRecorder) Header() http.Headerfunc (rw *ResponseRecorder) Result() *http.Responsefunc (rw *ResponseRecorder) Write(buf []byte) (int, error)func (rw *ResponseRecorder) WriteHeader(code int)func (rw *ResponseRecorder) WriteString(str string) (int, error)
type Server
Server是一个HTTP服务端,在本地环回接口的某个系统选择的端口监听,用于点对点HTTP测试。
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "Hello, client")}))defer ts.Close()res, err := http.Get(ts.URL)if err != nil {log.Fatal(err)}greeting, err := ioutil.ReadAll(res.Body)res.Body.Close()if err != nil {log.Fatal(err)}fmt.Printf("%s", greeting)
type Server struct {URL string // 格式为http://ipaddr:port,没有末尾斜杠的基地址Listener net.Listener// TLS是可选的TLS配置,在TLS开始后会填写为新的配置。// 如果在未启动的Server调用StartTLS方法前设置,已经存在的字段会拷贝进新配置里。TLS *tls.Config// Config可能会在调用Start/StartTLS方法之前调用NewUnstartedServer时被修改。Config *http.Server// 内含隐藏或非导出字段}// NewServer返回一个新的、已启动的Server。调用者必须在用完时调用Close方法关闭它。func NewServer(handler http.Handler) *Serverfunc NewTLSServer(handler http.Handler) *Server// NewUnstartedServer返回一个新的、未启动的Server。//在修改其配置后,调用者应该调用Start或StartTLS启动它;调在用完时用者必须调用Close方法关闭它。func NewUnstartedServer(handler http.Handler) *Serverfunc (s *Server) Start()func (s *Server) StartTLS()func (s *Server) CloseClientConnections() // 关闭当前任何与该服务端建立的HTTP连接。func (s *Server) Close() // Close关闭服务端,并阻塞到所有该服务端未完成的请求都结束为止。
demo: gin middleware测试
func TestCors(t *testing.T) {t.Run("without cors middleware", func(t *testing.T) {r := gin.New()r.GET("/", func(context *gin.Context) {})req := httptest.NewRequest("GET", "/", nil)w := httptest.NewRecorder()r.ServeHTTP(w, req)assert.Equal(t, w.Code, 200)assert.Equal(t, w.Header().Get("Access-Control-Allow-Origin"), "")assert.Equal(t, w.Header().Get("Access-Control-Allow-Credentials"), "")assert.Equal(t, w.Header().Get("Access-Control-Allow-Headers"), "")assert.Equal(t, w.Header().Get("Access-Control-Allow-Methods"), "")})t.Run("with cors middleware", func(t *testing.T) {gin.SetMode(gin.DebugMode)r := gin.New()r.Use(Cors())r.GET("/", func(context *gin.Context) {})req := httptest.NewRequest("GET", "/", nil)w := httptest.NewRecorder()r.ServeHTTP(w, req)assert.Equal(t, w.Code, 200)assert.Equal(t, w.Header().Get("Access-Control-Allow-Origin"), "")assert.Equal(t, w.Header().Get("Access-Control-Allow-Credentials"), "true")assert.Equal(t, w.Header().Get("Access-Control-Allow-Headers"), "AUTH,CSRF_TOKEN")assert.Equal(t, w.Header().Get("Access-Control-Allow-Methods"), "POST, GET, OPTIONS,PUT,DELETE")assert.Equal(t, w.Header().Get("Access-Control-Expose-Headers"), "AUTH,CSRF_TOKEN")})}
