在Golang中用一个不存在的HTTP服务器模拟一个不存在的端点

98 阅读1分钟

这个例子告诉我们如何在Golang中模拟一个不存在的端点/路由器和一个不存在的HTTP服务器。从技术上讲,你是在写代码之前写测试。

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/http/httptest"
	"testing"
)

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

	req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/api/v1/users", srv.URL), nil)
	if err != nil {
		t.Error(err)
	}

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		t.Error(err)
	}
	defer res.Body.Close()

	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		log.Fatal(err)
	}

	if http.StatusOK != res.StatusCode  {
		t.Error("expected", http.StatusOK, "got", res.StatusCode)
	}
	if "Hello" != string(body) {
		t.Error("expected Hello got", string(body))
	}
}

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

	srv := httptest.NewServer(handler)

	return srv
}

func usersMock(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello"))
}