我发现在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
这样的工具似乎无法处理结构体和包函数。如何处理这种情况? 我非常熟悉控制反转以及不同的模式,例如依赖注入和服务定位器,但我已经听到过无数次这不是惯用方法。
CreatePullRequest
的逻辑,我对集成测试不感兴趣。 - TheJediCowboy...
后面的逻辑拆分成自己的测试,那么我测试了这些内容,但没有测试CreatePullRequest(...)
中的逻辑。我仍然希望有一个单元测试来测试这个代码单元的逻辑流程。 - TheJediCowboy