gpt4 book ai didi

docker - 如何在 Golang 中模拟 docker ApiClient?

转载 作者:行者123 更新时间:2023-12-05 02:42:42 26 4
gpt4 key购买 nike

我已经为 Docker ApiClient 实现了一个包装器像这样

type DockerClient struct {
cli client.APIClient
}

我还定义了我自己的接口(interface)来像这样与 Docker 交互

type Dockerer interface {
Init() error
CreateContainer(ctx context.Context, imageName string) (string, error)
RunCommand(ctx context.Context, containerId string, command string) (string, int, error)
StopContainer(ctx context.Context, containerId string) error
}

DockerClient 实现了 Dockerer 接口(interface)中的功能,如下所示:

func (d *DockerClient) Init() error {
//...
}

func (d *DockerClient) CreateContainer(ctx context.Context, imageName string) (string, error) {
//...
}


func (d *DockerClient) RunCommand(ctx context.Context, containerId string, command string) (string, int, error) {
//...
}

func (d *DockerClient) StopContainer(ctx context.Context, containerId string) error {
//...
}

这使得测试我的代码中需要与 Docker 接口(interface)的组件变得容易,因为我可以为我的 Dockerer 接口(interface)生成一个模拟,并依赖注入(inject)该模拟。

但是,现在我想为 DockerClient 包装器的实际实现编写测试。 docker 包似乎没有为 ApiClient 提供模拟。当我需要使用的包不提供模拟时,是否有用于编写测试的规范模式?有没有办法得到mockery为库接口(interface)生成模拟?

最佳答案

client.APIClient是一个接口(interface)。您可以将该接口(interface)嵌入结构中。是的,你可以做到这一点。 您可以在结构中嵌入接口(interface)。 然后您有选择地实现测试所需的方法。这样您就不必从接口(interface)中实现每一个方法。实现 client.APIClient 提供的所有方法是不切实际的,因为它嵌入了嵌入大量接口(interface)的接口(interface)。 See .

像这样,


type mockCli struct{
client.APIClient
}

func (mockCli) ClientVersion() string {
return "5"
}


func TestA(t *testing.T) {
dc := &DockerClient{
cli: new(mockCli),
}

...

dc.Init()
// This will print "5" if your Init has
// fmt.Println(d.cli.ClientVersion())) somewhere.

// If you call any other method of cli, you get panic.
// A good thing. It will inform you that you are using
// some method that you don't have on mockCli. You
// just add it then.

}

关于docker - 如何在 Golang 中模拟 docker ApiClient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67347082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com