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"))
}