我有以下功能可以正常使用。 现在,我要对其进行单元测试。
func httpClient(cc []string,method http) ([]byte, error) {
httpClient := http.Client{}
req, err := http.NewRequest(http.MethodPost, c[0]+"/oauth/token", nil)
if err != nil {
fmt.error(err)
}
//Here we are passing user and password
req.SetBasicAuth(c[1], c[2])
res, err := httpClient.Do(req)
if err != nil {
fmt.error(err)
}
val, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.error(err)
}
defer res.Body.Close()
return val, nil
}
问题是我需要一些东西来伪造http呼叫,
我尝试使用以下方法,更改方法签名,并将方法和url作为参数。
问题是我不知道该如何伪造POST
方法
这是更改的代码,以使测试更容易
func httpClient(cc []string, method string, url string) ([]byte, error) {
httpClient := http.Client{}
req, err := http.NewRequest(method, url, nil)
if err != nil {
return nil, errors.Wrap(err, "failed to execute http request")
}
//Here we are passing user and password
req.SetBasicAuth(cc[1], cc[2])
res, err := httpClient.Do(req)
if err != nil {
fmt.error(err)
}
val, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.error(err)
}
defer res.Body.Close()
return val, nil
}
这是我尝试的测试,但仍然不起作用,因为我需要以某种方式伪造 post方法
func Test_httpClient(t *testing.T) {
type args struct {
params []string
method string
url string
}
tests := []struct {
name string
args args
want []byte
wantErr bool
}{
{
name: "httpCallTest",
args:{{"fakeuser", "fakepasswword"},{"post"},{"/any/url"}},
want: nil,
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := httpClient(tt.args.params, tt.args.method, tt.args.url)
if (err != nil) != tt.wantErr {
t.Errorf("httpClient() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("httpClient() = %v, want %v", got, tt.want)
}
})
}
}
答案 0 :(得分:3)
我建议您看一下httptest软件包。它有一个适合您的假HTTP服务器。
Dimensions:
- Name: QueueName
Value: { "Fn::GetAtt": [ "KinesisStreamFileQueue", "QueueName"] }
答案 1 :(得分:2)
我将使用以下代码。用法是newTestServer(address).run()
import (
"github.com/gorilla/mux"
"net/http"
"sync"
"time"
)
type testServer struct {
addr string
router *mux.Router
}
// addr can be e.g. `localhost:3030`
// -> your client will do request on `localhost:3030/some/endpoint/path`
func newTestServer(addr string) *testServer {
router := mux.NewRouter()
router.HandleFunc(
"/some/endpoint/path",
handleEndpoint,
).Methods(http.MethodPost)
return &testServer{
addr: addr,
router: router,
}
}
func handleEndpoint(writer http.ResponseWriter, request *http.Request) {
// your implementation
}
func (server *testServer) run() {
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
wg.Done()
if err := http.ListenAndServe(server.addr, server.router); err != nil {
panic(err)
}
}()
wg.Wait() // wait for goroutine starts
time.Sleep(100 * time.Millisecond) // wait for listening starts
}
但是我认为测试仍然不会通过。
// this will panic
// requires 2nd and 3rd item in an array
req.SetBasicAuth(cc[1], cc[2])