【问题标题】:How to mock httpclient using mockery如何使用 mockery 来模拟 httpclient
【发布时间】: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 中使用哪些参数。我应该通过什么?

【问题讨论】:

    标签: unit-testing go mockery


    【解决方案1】:

    http.Response(注意它没有方括号,它主要表示一个类型)是一个表达式,而您应该返回实际响应(函数的返回值),因为函数返回两个值*http.Response a指向 http 响应结构和 errornil 的指针。

    body := ioutil.NopCloser(strings.NewReader("hello world"))
    httpRespose := &http.Response{Body: 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
    )
    

    【讨论】:

      猜你喜欢
      • 2018-03-26
      • 2018-09-13
      • 2015-08-15
      • 2013-07-29
      • 2014-11-05
      • 2018-07-02
      • 2022-01-04
      • 2016-08-17
      • 1970-01-01
      相关资源
      最近更新 更多