登录
首页 >  Golang >  Go问答

通过模拟进行 Golang 测试参数传递

来源:stackoverflow

时间:2024-03-06 22:42:25 461浏览 收藏

本篇文章向大家介绍《通过模拟进行 Golang 测试参数传递》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

这是我正在测试的代码

func listobjects(cli *client.client, options clientoptions) ([]blobobjects, error) {
    objects, err := cli.listblobobjects(...)
}

在我的测试设置中我这样做

type mockclient struct {
    mocklistblobobjects func() ([]blobobjects, error)
}

func (m *mockclient) listblobobjects(....) ([]blobobjects, error) {
    // return some mock response
}

这是我的测试用例

func testblobobjects(t *testing.t) {
    tests := map[string]struct {
        client         *mockclient
        ...
    }{
        "test case 1": {
            client: &mockclient{
                mocklistblobobjects: ....,
            },
            ....
        },

      ....
   for testname, test := range tests {
      blobs, err := (test.client, clientoptions{})
      // make assertions here
   }

问题是test.client。编译器告诉我

cannot use test.client (variable of type *MockClient) as *client.Client value in argument to listObjects

我希望我有一个模拟客户端,如果我调用被测试的函数,那么传递的模拟客户端将调用模拟的 listobjects。这就是我在 python 中的做法。

我应该在golang中做什么?


正确答案


您需要创建一个通用接口,该接口将由两种类型实现

type client interface {
    listblobobjects func() ([]blobobjects, error)
}

type realclient struct {
}

func (c *realclient) listblobobjects(....) ([]blobobjects, error) {
    // return some response
}

type mockclient struct {
  // note: don't put method signature in function body
}

func (m *mockclient) listblobobjects(....) ([]blobobjects, error) {
    // return some mock response
}

然后

var client client.Client
client = &RealClient{}
// or
client = &MockClient{}

今天关于《通过模拟进行 Golang 测试参数传递》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>