在golang中模拟外部struct依赖项

时间:2017-02-23 17:45:23

标签: unit-testing go

我很难找到在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之类的工具,似乎你对结构和包函数感到不快。

处理此问题的惯用方法是什么?我非常熟悉控制反转以及依赖注入和服务定位器等不同的模式,但我听过无数次这不是惯用的。

1 个答案:

答案 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