gpt4 book ai didi

amazon-web-services - 如何模拟 s3Client 以便我可以在 Golang 测试中运行 GetObject()?

转载 作者:行者123 更新时间:2023-12-04 13:55:02 27 4
gpt4 key购买 nike

我有一个接受路径和 S3Client 的函数:ListObjects(folder, s3Client)我希望它在生产中接受一个“真正的”客户。即:s3.New(session.New()但是当我运行我的测试时,我更喜欢它接受我的模拟版本,这样我们就不会在测试中与 AWS 交谈。
我实现这一目标的方法是制作一个与真实 S3Client 和我的模拟版本都匹配的界面。
这是最好的方法还是我错过了什么?
首先,我用我计划模拟的函数定义了接口(interface)。

  package core

import "github.com/aws/aws-sdk-go/service/s3"

type MyS3ClientInterface interface {
ListObjects(input *s3.ListObjectsInput) (*s3.ListObjectsOutput, error)
}
GetObjectsFromS3 是这样实现的:
// GetObjectsFromS3 returns a list of objects found in provided path on S3
func GetObjectsFromS3(path string, s3Client core.MyS3ClientInterface) ([]*core.Asset, error) {
// build input variable
result, err := s3Client.ListObjects(input)
// cut..
}
这是我模拟的 s3Client.ListObjects 版本
  package test_awstools

import (
"github.com/aws/aws-sdk-go/service/s3"
)

type MyS3Client struct{}

func (m MyS3Client) ListObjects(input *s3.ListObjectsInput) (*s3.ListObjectsOutput, error) {
output := &s3.ListObjectsOutput{}
return output, nil
}

func (m MyS3Client) GetObject(input *s3.GetObjectInput) (*s3.GetObjectOutput, error) {
// output := &s3.GetObject()
return nil, nil
}
内部/awstools/bucket_test.go
  1 package awstools
2
3 import (
4 "fmt"
5 "testing"
6
7 "internal/test_awstools"
8 )
9
10 func TestListObjects(t *testing.T) {
11 folder := "docs"
// Use my mocked version of the S3 client.
12 s3Client := &test_awstools.MyS3Client{}
// And I pass that along to the ListObject function
13 objects, err := ListObjects(folder, s3Client)
14 if err != nil {
15 t.Error(err)
16 }
17 fmt.Println(objects)
18 }

最佳答案

我可以建议的一个小改进是允许您的模拟结构接受一个函数,这样它就可以在测试之间有所不同。像这样的东西:

  package test_awstools

import (
"github.com/aws/aws-sdk-go/service/s3"
)

type MyS3Client struct {
ListObjectsFunc func(*s3.ListObjectsInput) (*s3.ListObjectsOutput, error)
GetObjectFunc func(*s3.GetObjectInput) (*s3.GetObjectOutput, error)
}

func (m *MyS3Client) ListObjects(input *s3.ListObjectsInput) (*s3.ListObjectsOutput, error) {
return m.ListObjectsFunc(input)
}

func (m *MyS3Client) GetObject(input *s3.GetObjectInput) (*s3.GetObjectOutput, error) {
return m.GetObjectFunc(input)
}
现在在你的测试中你可以设置 *Func结构上的值,以便您的测试对 stub 行为更具声明性:
func TestListObjects(t *testing.T) {
folder := "docs"

// Use my mocked version of the S3 client.
s3Client := &test_awstools.MyS3Client{}

// Set the ListObjectsFunc to behave the way you want
s3Client.ListObjectsFunc = func(input *s3.ListObjectsInput) (*s3.ListObjectsOutput, error) {
output := &s3.ListObjectsOutput{}
return output, nil
}

// Make the call to list objects (which is now mocked)
objects, err := s3Client.ListObjects(folder, s3Client)

// Do your assertions
if err != nil {
t.Error(err)
}
fmt.Println(objects)
}

关于amazon-web-services - 如何模拟 s3Client 以便我可以在 Golang 测试中运行 GetObject()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64061117/

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