如果你的应用程序使用HTTP客户端来调用另一个服务,如果你希望在测试环境中不调用该服务,你可以使用下面的例子。它模拟了服务,所以你的HTTP客户端调用模拟服务。
客户端
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
}
测试
package pkg
import (
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
)
func TestConsumer_GetUsers(t *testing.T) {
srv := serverMock()
defer srv.Close()
consumer := Consumer{ServiceAddress: srv.URL}
res, err := consumer.GetUsers()
if err != nil {
t.Error(err)
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
t.Error(err)
}
res.Body.Close()
if http.StatusOK != res.StatusCode {
t.Error("expected", http.StatusOK, "got", res.StatusCode)
}
if "mock server responding" != string(body) {
t.Error("expected mock server responding got", string(body))
}
}
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"))
}