Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

Golang uygulamanızda bir panik kurtarma ara biriminizin olduğunu ve beklendiği gibi çalıştığından emin olmak istediğinizi varsayın. Bu amaçla aşağıdaki örnek testi kullanabilirsiniz.


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)
assert.Equal(t, `{"code":"internal_error","message":"Internal error"}`, res.Body.String())
}