我正在尝试将被调用的参数值传递给一个mock函数,Go语言mock的功能是否类似于Jest
中的someMockFunction.mock.calls[0][0]).toBe('first arg')
或者Mockito
中的ArgumentCaptor
?
这是我的用例。
我有一个调用外部API的Client
结构体。
func (c *Client) SubmitForm(ctx context.Context ) (string, error) {
formVals := url.Values{}
// Payload created here
apiUrl := url.URL{Scheme: "http", Host: "api.mytestservice.com, Path: "/submit"}
httpReq, err := http.NewRequestWithContext(ctx, http.MethodPost, apiUrl.String(), strings.NewReader(formVals.Encode()))
httpReq.Header.Set("Authorization", <sometoken>)
httpReq.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := c.httpClient.Do(ctx, submitPickupSchedule, httpReq) // This calls to a mock httpClient.Do()
// error handling and return values goes here
return resp, err
}
我的模拟是用Mockery
创建的(我也试过Mockgen
)。
mockHTTPClient := mock_httputils.NewMockHTTPClient(ctrl)
client = Client{httpClient: mockHTTPClient} // Using the mock HTTP client here
t.Run("should call the Do with post request successfully", func(t *testing.T) {
ctx := context.Background()
ctx = context.WithValue(ctx, utils.CTXAuthTokenKey, "value")
mockHTTPClient.EXPECT().Do(ctx, "SubmitCall",
gomock.Any()).Return(&http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewReader([]byte("SUCCESS")))}, nil)
resp, err := client.SubmitForm(ctx)
// assertions here and everything works as expected. It calls the mock method.
}
在调用模拟Do()
之后,我试图获取调用到该函数中的实际参数。也就是说,我想检查在SubmitForm
方法中创建并传递到此模拟Do()
中的req
对象。
在GoLang有办法做到这一点吗?
1条答案
按热度按时间laik7k3q1#
在@mkopriva的评论之后,我能够在一个模拟函数中捕获参数。在这里发布我的解决方案,以便将来对任何人都有帮助。