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.Buffer
Flushed bool
// 内含隐藏或非导出字段
}
func NewRecorder() *ResponseRecorder
func (rw *ResponseRecorder) Flush() // Flush将rw.Flushed设置为真。
func (rw *ResponseRecorder) Header() http.Header
func (rw *ResponseRecorder) Result() *http.Response
func (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) *Server
func NewTLSServer(handler http.Handler) *Server
// NewUnstartedServer返回一个新的、未启动的Server。
//在修改其配置后,调用者应该调用Start或StartTLS启动它;调在用完时用者必须调用Close方法关闭它。
func NewUnstartedServer(handler http.Handler) *Server
func (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")
})
}