我有以下功能可以正常工作。现在,我想对其进行单元测试。
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)
}
})
}
}
我建议您看一下httptest软件包。它有一个适合您的假HTTP服务器。
func Test_httpClient(t *testing.T){
var called bool
defer func(){
if !called{
t.Fatal("expected endpoint to be called")
}
}()
expectedValue = "some-value"
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){
called = true
u,p,ok := r.BasicAuth()
if !ok || u != "fakeuser" || p != "fakepassword" {
t.Fatal("wrong auth")
}
w.Write([]byte(expectedValue))
})
val, err := httpClient(
[]string{"fakeuser", "fakepasswword"},
http.MethodPost,
server.URL,
)
if err != nil{
t.Fatal(err)
}
if val != expectedValue {
t.Fatalf("expected %q to equal %q", val, expectedValue)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句