我正在编写一个充当Github API客户端的程序。我使用https://github.com/google/go-github来访问API。我有一个函数接受github.Client
作为参数之一,并使用它从拉取请求中检索提交。我想用一些假数据测试这个函数。
在这里的文章中:https://nathanleclaire.com/blog/2015/10/10/interfaces-and-composition-for-effective-unit-testing-in-golang/我读过,我应该创建一个由github客户端实现的接口,然后在我的测试中创建一个也可以实现它的模拟。我的问题是,go-github
使用以下语义来检索拉取请求:
prs, resp, err := client.PullRequests.List("user", "repo", opt)
然而,接口允许您指定应实现的方法,但不能指定 fields 。那么如何模拟github.Client对象以便它可以在上面的语义中使用呢?
答案 0 :(得分:2)
在您的情况下可能不实用,特别是如果您使用github.Client
中的大量功能,但您可以使用嵌入来创建实现您定义的接口的新结构。
type mockableClient struct {
github.Client
}
func (mc *mockableClient) ListPRs(
owner string, repo string, opt *github.PullRequestListOptions) (
[]*github.PullRequest, *github.Response, error) {
return mc.Client.PullRequests.List(owner, repo, opt)
}
type clientMocker interface {
Do(req *http.Request, v interface{}) (*github.Response, error)
ListPRs(string,string,*github.PullRequestListOptions) (
[]*github.PullRequest, *github.Response, error)
}