嘿,所以我已经看到并使用这篇文章来帮助模拟我的 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。不确定为什么会发生这种情况,因为它们是同一个包的一部分,所以我认为它可以轻松导出?