英文:
Gomock same method twice with different input
问题
注意:这是你的中文翻译结果:
我正在使用github.com/golang/mock/gomock
库来模拟一个HTTP客户端接口,以便测试我的代码行为。我的代码在客户端上两次使用相同的Post()
方法,但是针对两个不同的端点。
我尝试了以下代码:
mockUc.EXPECT().
Post("m-elasticsearch/_sql/translate", gomock.Eq(expectedQuery), gomock.Any(), gomock.Any()).
SetArg(2, esQuery).
Return(http.StatusOK, nil).
Times(1)
mockUc.EXPECT().
Post("m-elasticsearch/app-*/_search", gomock.Eq(esQuery), gomock.Any(), gomock.Any()).
SetArg(2, logResults).
Return(http.StatusOK, nil).
Times(1)
但是这给我带来了错误,告诉我第二个EXPECT()
被认为是在第一次调用时使用:
expected call at [...] doesn't match the argument at index 0.
Got: m-elasticsearch/_sql/translate (string)
Want: is equal to m-elasticsearch/app-*/_search (string)
然后我尝试使用gomock.InOrder()
,像这样:
first := mockUc.EXPECT().
Post("m-elasticsearch/_sql/translate", gomock.Eq(expectedQuery), gomock.Any(), gomock.Any()).
SetArg(2, esQuery).
Return(http.StatusOK, nil).
Times(1)
second := mockUc.EXPECT().
Post("m-elasticsearch/app-*/_search", gomock.Eq(esQuery), gomock.Any(), gomock.Any()).
SetArg(2, logResults).
Return(http.StatusOK, nil).
Times(1)
gomock.InOrder(first, second)
但是这也没有帮助。
我在这里尝试的方法是否可行?
英文:
Note: Not a duplicate of https://stackoverflow.com/questions/62165773/mock-interface-method-twice-with-different-input-and-output-using-testify - Different library.
I am using the github.com/golang/mock/gomock
library to mock an HTTP client interface in order to test the behaviour of my code. My code uses the same Post()
method on the client twice, but for 2 different endpoints.
I tried:
mockUc.EXPECT().
Post("m-elasticsearch/_sql/translate", gomock.Eq(expectedQuery), gomock.Any(), gomock.Any()).
SetArg(2, esQuery).
Return(http.StatusOK, nil).
Times(1)
mockUc.EXPECT().
Post("m-elasticsearch/app-*/_search", gomock.Eq(esQuery), gomock.Any(), gomock.Any()).
SetArg(2, logResults).
Return(http.StatusOK, nil).
Times(1)
But this gave me the error, telling me that the second EXPECT()
was being considered on the first call:
expected call at [...] doesn't match the argument at index 0.
Got: m-elasticsearch/_sql/translate (string)
Want: is equal to m-elasticsearch/app-*/_search (string)
I then tried using gomock.InOrder()
like this:
first := mockUc.EXPECT().
Post("m-elasticsearch/_sql/translate", gomock.Eq(expectedQuery), gomock.Any(), gomock.Any()).
SetArg(2, esQuery).
Return(http.StatusOK, nil).
Times(1)
second := mockUc.EXPECT().
Post("m-elasticsearch/app-*/_search", gomock.Eq(esQuery), gomock.Any(), gomock.Any()).
SetArg(2, logResults).
Return(http.StatusOK, nil).
Times(1)
gomock.InOrder(first, second)
But this didn't help either.
Is what I'm trying to do possible here?
答案1
得分: 3
代替编写两个EXPECT,你可以使用DoAndReturn方法,在一个EXPECT中返回你想要的值。我无法写出类型,因为我不知道方法的签名。
mockUc.
EXPECT().
Post(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).
DoAndReturn(func(url, query string, ...) (int, error) {
if url == "m-elasticsearch/_sql/translate" {
return http.StatusOK, nil
} else {
return http.StatusOK, nil
}
})
英文:
Instead of writing two EXPECTs, you can use DoAndReturn method and return the value as you want in one EXPECT. I could not write types because I do not know method signature.
mockUc.
EXPECT().
Post(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).
DoAndReturn(func(url, query string, ...) (int, error) {
if url == "m-elasticsearch/_sql/translate" {
return http.StatusOK, nil
} else {
return http.StatusOK, nil
}
})
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论