如何使用http作为依赖项进行单元测试

07_05_GuyT:

我有以下功能可以正常工作。现在,我想对其进行单元测试。

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)
            }
        })
    }
}
poy:

我建议您看一下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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用http作为包装函数依赖项的单元测试

如何正确使用大量依赖项进行单元测试

对使用getBean(“ myService”)的依赖项进行类的单元测试

如何使用mocha.js模拟依赖项类进行单元测试?

如何使用HttpWebRequest / Response依赖项对方法进行单元测试

如何使用在方法中具有依赖项的moq来对类进行单元测试?

如何使用内部依赖项对ES6模块进行单元测试

如何对使用依赖项的FP功能进行单元测试

如何在单元测试中使用android依赖项?

如何测试具有由 android 生成的接口依赖项的 ViewModel 类作为单元测试

如何对依赖的 if 语句进行单元测试?

如何对依赖的cpde进行单元测试

使用外部JavaScript依赖项对ionic3项目进行单元测试

如何使用构造函数依赖项注入对asp.net核心应用程序进行单元测试

如何使用 Moq 对具有三个依赖项的 MVC 控制器进行单元测试

对具有依赖项的AngularJS工厂进行单元测试

如何在python中伪造缺少的依赖项以进行单元测试?

使用嘲讽对具有依赖项的类进行单元测试

如何对依赖于外部库“ <script src =“ http:// stripe [...]”的API进行单元测试

使用Jest对依赖于HTTP调用的代码进行单元测试的最佳方法?

如何使用 gorm 进行单元测试

如何对依赖TaskCompletionSource的类进行单元测试?

如何对依赖服务的组件的方法进行单元测试?

如何对依赖于springBoot applicationContext的单元测试方法进行单元测试?

最佳实践-单元测试依赖项

在单元测试中模拟依赖项

单元测试依赖项注入

使用Python进行单元测试中的依赖注入

如何在@ComponentScan @Configuration中使用DataSource依赖项对Spring Boot应用程序的控制器进行单元测试