首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试模拟http.Client时出现错误

尝试模拟http.Client时出现错误
EN

Stack Overflow用户
提问于 2021-03-11 21:30:31
回答 1查看 346关注 0票数 0

嘿,我已经看到并使用了this post来帮助模拟我的http.Client,但是当我试图传递模拟请求时,我得到了以下错误:不能在api.callAPI的参数中使用mockClient (*MockClient类型的变量)作为*"net/http".Client值。

在一个文件中,我有我的实际代码:

我创建了HTTPClient:

代码语言:javascript
复制
type HTTPClient interface {
    Do(req *http.Request) (*http.Response, error)
}

我有一个将HTTPClient作为接口传递的函数(我不能全部展示,因为它是为了工作,但下面是重要的部分):

代码语言:javascript
复制
func (api *API) callAPI(req *http.Request, client HTTPClient) (utils.ErrorWrapper, bool) {
response, err := client.Do(req)
}

我还有另一个调用callAPI方法的函数。在调用callAPI函数之前,我在该函数中创建了客户端变量

代码语言:javascript
复制
var Client HTTPClient = &http.Client{}
response, isRetry := api.callAPI(req, Client)

这一切都运行得很好。然而,在我的测试文件中,我得到了上面提到的错误。我正在使用证言作为我的模仿框架。下面是我的测试文件中的内容(测试文件和实际代码都在同一个包中):

使用testify设置我的模拟客户机和Do函数

代码语言:javascript
复制
type MockClient struct {
    mock.Mock
}

func (m *MockClient) Do(req *http.Request) (*http.Response, error) {
    args := m.Called()
    resp := args.Get(0)
    return resp.(*http.Response), args.Error(1)
}

然后创建我的测试:

代码语言:javascript
复制
func TestCallAPI(t *testing.T) {

    mockClient := &MockClient{}

    recorder := httptest.NewRecorder()
    responseCh := make(chan utils.ErrorWrapper)
    c, _ := gin.CreateTestContext(recorder)
id:= "unitTest123"


    api := NewAPICaller(responseCh, id, c)

    var response = Response{
        StatusCode: 200,
    }
    //setup expectations
    mockClient.On("Do").Return(response, nil)

    req, _ := http.NewRequest("GET", "URL I Can't Show", nil)


    wrapper, isRetry := api.callAPI(req, mockClient)
    mockClient.AssertExpectations(t)
    assert.Equal(t, "placeholder", wrapper)
    assert.Equal(t, false, isRetry)

}

我尝试用mockclient变量做类似的事情,就像我用Client变量做的那样:

代码语言:javascript
复制
var mockclient HTTPClient = &MockClient{}

但是我在HTTPClient上得到了这个错误:未声明的名称:HTTPClient。不确定为什么会发生这种情况,因为它们是同一个包的一部分,所以我认为它可以很容易地导出?

EN

回答 1

Stack Overflow用户

发布于 2021-03-12 00:00:21

有两种方法可以实现这一点。

@Volker建议的

  1. 。设置HTTP服务器。您可以使用docker容器为您的测试运行它。

HTTP的其他选项(我最喜欢的单元测试)是将客户端包装在您自己的接口中。该接口将公开特定于您的域的方法,或者可能只是简单的GETPOST。然后使用像mockgen这样的库来生成模拟。这个库基于接口生成mock。有了这个设置,您就可以对公开的方法进行适当的单元测试。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66583540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档