0

嘿,所以我已经看到并使用这篇文章来帮助模拟我的 http.Client 但是当我尝试传递模拟请求时,我收到以下错误:不能使用 mockClient (variable of type *MockClient) as *"net/http".Client api.callAPI 参数中的值。

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

我创建了 HTTPClient:

type HTTPClient interface {
    Do(req *http.Request) (*http.Response, error)
}

我有将 HTTPClient 作为接口传递的函数(我无法显示所有这些,因为它是为了工作,但这是重要的部分):

func (api *API) callAPI(req *http.Request, client HTTPClient) (utils.ErrorWrapper, bool) {
response, err := client.Do(req)
}

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

var Client HTTPClient = &http.Client{}
response, isRetry := api.callAPI(req, Client)

这一切都很好。但是,在我的测试文件中,我收到了上述错误。我正在为我的模拟框架使用 testify。这是我的测试文件中的内容(测试文件和实际代码都在同一个包中):

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

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

然后创建我的测试:

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 变量所做的那样:

var mockclient HTTPClient = &MockClient{}

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

4

1 回答 1

-2

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

  1. 正如@Volker所建议的那样。设置 HTTP 服务器。您可以使用 docker 容器为您的测试运行它。

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

于 2021-03-11T16:00:20.830 回答