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.

Uygulamanızda bir uç noktaya istek gönderdiğinizde, harici bir servisi çağırdığını varsayın. Harici servisi taklit etmeden bir test yazarsanız, testiniz aslında harici servisi çağırır. Bu tür bir sorunu önlemek için, aşağıda gösterildiği gibi testlerinizle harici servisi taklit edebilirsiniz.


Consumer


Arka planda harici servisi çağıran budur, ancak bunun için bir test yazmayacağız. Bunun yerine, taklit edilen sunucunun adresini testimizde kullanacağız.


package pkg

import "net/http"

type Consumer struct {
ServiceAddress string
}

func (c Consumer) GetUsers() (*http.Response, error) {
req, err := http.NewRequest(http.MethodGet, c.ServiceAddress + "/server/api/v1/users", nil)
if err != nil {
return nil, err
}

client := http.Client{}
res, err := client.Do(req)
if err != nil {
return nil, err
}

return res, nil
}

Endpoint


package app

import (
"io/ioutil"
"net/http"

"internal/pkg"
)

type User struct {
ServiceConsumer pkg.Consumer
}

func (u User) Create(w http.ResponseWriter, r *http.Request) {
res, err := u.ServiceConsumer.GetUsers()
if err != nil {
_, _ = w.Write([]byte(err.Error()))
return
}

body, err := ioutil.ReadAll(res.Body)
if err != nil {
_, _ = w.Write([]byte(err.Error()))
return
}
res.Body.Close()

_, _ = w.Write(body)
}

Test


package app

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

"internal/pkg"
)

func TestUser_Create(t *testing.T) {
srv := serverMock()
defer srv.Close()

req := httptest.NewRequest(http.MethodGet, "/client/api/v1/users", nil)
res := httptest.NewRecorder()

user := User{ServiceConsumer: pkg.Consumer{ServiceAddress: srv.URL}}

user.Create(res, req)

if http.StatusOK != res.Code {
t.Error("expected", http.StatusOK, "got", res.Code)
}
if "mock server responding" != res.Body.String() {
t.Error("expected mock server responding got", res.Body.String())
}
}

func serverMock() *httptest.Server {
handler := http.NewServeMux()
handler.HandleFunc("/server/api/v1/users", usersMock)

srv := httptest.NewServer(handler)

return srv
}

func usersMock(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte("mock server responding"))
}