嘿,我已经看到并使用了this post来帮助模拟我的http.Client,但是当我试图传递模拟请求时,我得到了以下错误:不能在api.callAPI的参数中使用mockClient (*MockClient类型的变量)作为*"net/http".Client值。
在一个文件中,我有我的实际代码:
我创建了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设置我的模拟客户机和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。不确定为什么会发生这种情况,因为它们是同一个包的一部分,所以我认为它可以很容易地导出?
发布于 2021-03-12 00:00:21
有两种方法可以实现这一点。
@Volker建议的
HTTP的其他选项(我最喜欢的单元测试)是将客户端包装在您自己的接口中。该接口将公开特定于您的域的方法,或者可能只是简单的GET,POST。然后使用像mockgen这样的库来生成模拟。这个库基于接口生成mock。有了这个设置,您就可以对公开的方法进行适当的单元测试。
https://stackoverflow.com/questions/66583540
复制相似问题