如何使用 mockery 来模拟 httpclient
Posted
技术标签:
【中文标题】如何使用 mockery 来模拟 httpclient【英文标题】:How to mock httpclient using mockery 【发布时间】:2020-05-10 19:40:43 【问题描述】:我正在尝试使用 Mockery 模拟 Http 客户端,但是当我尝试传入返回值时,我收到一条错误消息:type http.Response is not an expression
下面是我的界面和处理程序
type HTTPClient interface
Get(url string) (resp *http.Response, err error)
type Handler struct
httpClient HTTPClient
Mockery 生成了一个如下所示的模拟类
type HTTPClient struct
mock.Mock
// Get provides a mock function with given fields: url
func (_m *HTTPClient) Get(url string) (*http.Response, error)
ret := _m.Called(url)
var r0 *http.Response
if rf, ok := ret.Get(0).(func(string) *http.Response); ok
r0 = rf(url)
else
if ret.Get(0) != nil
r0 = ret.Get(0).(*http.Response)
var r1 error
if rf, ok := ret.Get(1).(func(string) error); ok
r1 = rf(url)
else
r1 = ret.Error(1)
return r0, r1
在我的测试中,我试图像下面那样模拟 httpclient
httpClient := &mocks.HTTPClient
httpClient.On("Get", request.SubscribeURL).Return(resp*http.Response, nil)
我不确定我应该在 Return 中使用哪些参数。我应该通过什么?
【问题讨论】:
【参考方案1】:http.Response
(注意它没有方括号,它主要表示一个类型)是一个表达式,而您应该返回实际响应(函数的返回值),因为函数返回两个值*http.Response
a指向 http 响应结构和 error
或 nil
的指针。
body := ioutil.NopCloser(strings.NewReader("hello world"))
httpRespose := &http.ResponseBody: body, Status: "200 OK", StatusCode: 200
httpClient.On("Get", request.SubscribeURL)
.Return(
httpRespose, // http response with string in the body and the code 200
nil, // no error occured while response processed
)
【讨论】:
以上是关于如何使用 mockery 来模拟 httpclient的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Mockery 模拟嵌套对象,如 GuzzleHttp 请求
如何使用 Mockery 在模拟方法的第 N 次调用中引发异常