我很难找到在golang中编写可测试代码的惯用方法。我理解接口的重要性及其在测试中的用途,但我还没有弄清楚如何模拟/测试外部结构依赖。
作为一个例子,我编写了以下代码,它模拟了一个用于在GitHub上创建拉取请求的包装器。
type GitHubService interface {
}
type gitHubService struct {
CreatePullRequest(...) (PullRequest,error)
}
func (s gitHubService) CreatePullRequest(...) (PullRequest,error) {
tp := github.BasicAuthTransport{
Username: strings.TrimSpace(/*.....*/),
Password: strings.TrimSpace(/*.....*/),
}
client := github.NewClient(tp.Client())
pr,err := client.Repositories.CreatePullRequest(...)
...
}
func TestPullRequest(t *testing.T) {
service := gitHubService{}
pr,err := service.CreatePullRequest(...)
...
}
如果我正在为GitHubService.CreatePullRequest(...)
编写单元测试,我想模拟对client.Repositories.CreatePullRequest(...)
的调用,甚至可能github.NewClient(...)
来返回我可以控制的模拟实现。
使用gomock
之类的工具,似乎你对结构和包函数感到不快。
处理此问题的惯用方法是什么?我非常熟悉控制反转以及依赖注入和服务定位器等不同的模式,但我听过无数次这不是惯用的。
答案 0 :(得分:3)
我有一个类似的问题看起来像,你唯一的选择是在它们之间有另一层可以叫你的#34; unmockable"客户端。
例如为了模仿govmi客户端(golang的vmware客户端sdk),我必须拥有一个" myCustomClient"有接口和结构来调用govmi.Client.AnyMethod ..
然后我可以为" myCustomClient"。
生成模拟mockgen -source myCustomClient.go -package myPackage -destination myCustomClientMock.go
您可以通过以下方式安装:got get github.com/golang/mock