在Golang中对恐慌性恢复中间件进行单元测试的例子

255 阅读1分钟

假设你在你的Golang应用程序中有一个恐慌恢复中间件,你想确保它按预期工作。你可以使用下面的测试例子。

package middleware

import (
	"log"
	"net/http"

	"internal/pkg/response"
)

func PanicRecovery(handler http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		defer func() {
			if err := recover(); err != nil {
				// Log the error or something else...

				if err := response.Write(w, response.Response{
					Status:  http.StatusInternalServerError,
					Code:    response.CodeInternalError,
					Message: response.MessageInternalError,
				}); err != nil {
					log.Println(err)
				}
			}
		}()

		handler.ServeHTTP(w, r)
	})
}
package middleware

import (
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestPanicRecovery(t *testing.T) {
	homeHandler := func(http.ResponseWriter, *http.Request) { panic("some error") }
	panicHandler := PanicRecovery(http.HandlerFunc(homeHandler))

	req := httptest.NewRequest("GET", "/", nil)
	res := httptest.NewRecorder()

	panicHandler.ServeHTTP(res, req)

	assert.Equal(t, 500, res.Code)