Amazon web services 如何模拟*ec2.DescribeVolumesOutput的值

Amazon web services 如何模拟*ec2.DescribeVolumesOutput的值,amazon-web-services,go,amazon-ec2,aws-sdk-go,Amazon Web Services,Go,Amazon Ec2,Aws Sdk Go,我目前正在尝试适应TDD,在我正在进行的一个项目中,我正在尝试利用AWS的Go SDK。这一切都很好,很漂亮,我以前也使用过它,但我目前正在尝试模拟*ec2.descripebolumesoutput发送的值 深入到代码中,我认为这是*ec2返回的内容。descripbevolumesoutput: 类型描述卷输出结构{ _结构{}`type:“结构”` //要包含在将来的DescribeVolumes请求中的NextToken值。当 //DescribeVolumes请求的结果超过MaxRes

我目前正在尝试适应TDD,在我正在进行的一个项目中,我正在尝试利用AWS的Go SDK。这一切都很好,很漂亮,我以前也使用过它,但我目前正在尝试模拟
*ec2.descripebolumesoutput
发送的值

深入到代码中,我认为这是
*ec2返回的内容。descripbevolumesoutput

类型描述卷输出结构{
_结构{}`type:“结构”`
//要包含在将来的DescribeVolumes请求中的NextToken值。当
//DescribeVolumes请求的结果超过MaxResults,此值可以
//用于检索下一页的结果。当存在
//不再返回任何结果。
NextToken*string`locationName:“NextToken”类型:“string”`
//有关卷的信息。
卷[]*卷`locationName:“卷集”位置名称列表:“项”类型:“列表”`
}
好的。。这很酷,但我想模拟的输出必须位于
Volumes[]*Volume
locationName:“volumeSet”locationNameList:“item”type:“list”`的内部,所以让我们深入一点,看看这是什么

类型卷结构{
_结构{}`type:“结构”`
//有关卷附件的信息。
附件[]*VolumeAttachment`locationName:“attachmentSet”locationNameList:“项”类型:“列表”`
//卷的可用区域。
AvailabilityZone*字符串`locationName:“AvailabilityZone”类型:“字符串”`
//卷创建启动时的时间戳。
CreateTime*time.time`locationName:“CreateTime”类型:“时间戳”`
//指示卷是否将被加密。
加密*bool`locationName:“加密”类型:“布尔”`
//卷支持的每秒I/O操作数(IOPS)。
//对于已配置的IOPS SSD卷,这表示已配置的IOPS数量
//为卷配置。对于通用SSD卷,这表示
//卷的基线性能和卷的累积速率
//爆破的I/O点数。有关更多信息,请参阅Amazon EBS卷类型
// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html)
//在Amazon弹性计算云用户指南中。
//
//限制条件:gp2卷的IOPS范围为100-16000,IOPS范围为100-64000
//对于io1卷,在大多数地区。保证io1的最大IOPS为64000
//仅在基于Nitro的实例上(https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-硝基实例)。
//其他实例系列可保证高达32000 IOPS的性能。
//
//条件:创建io1卷的请求需要此参数;
//它不用于创建gp2、st1、sc1或标准卷的请求中。
Iops*int64`locationName:“Iops”类型:“整数”`
//AWS密钥管理服务(AWS KMS)客户主机的完整ARN
//用于保护卷的卷加密密钥的密钥(CMK)。
KmsKeyId*字符串`locationName:“KmsKeyId”类型:“字符串”`
//卷的大小,以Gib为单位。
Size*int64`locationName:“Size”类型:“integer”`
//从中创建卷的快照(如果适用)。
SnapshotId*string`locationName:“SnapshotId”类型:“string”`
//卷状态。
State*string`locationName:“status”类型:“string”枚举:“VolumeState”`
//指定给卷的任何标记。
Tags[]*Tag`locationName:“tagSet”locationNameList:“item”类型:“list”`
//卷的ID。
VolumeId*string`locationName:“VolumeId”类型:“string”`
//卷类型。对于通用SSD,这可以是gp2;对于已配置的SSD,这可以是io1
//IOPS SSD、用于吞吐量优化硬盘的st1、用于冷硬盘的sc1或标准
//对于磁性体积。
VolumeType*string`locationName:“VolumeType”类型:“string”枚举:“VolumeType”`
}
很好!这看起来像是我想要模拟的一些数据的值

但在过去的几天里,我没有幸真正嘲笑这些价值观。它们是否嵌套在一起,以至于这种类型的模拟不值得付出努力?即使尝试使用
github.com/aws/aws sdk go/service/ec2/ec2iface
似乎也无法帮助我了解如何正确打包一些模拟值返回以进行测试。我来TDD是不是全错了?我是不是错过了一些非常明显的东西?我没有真正的示例代码来显示,因为我现在不再理解我正在尝试做什么


有没有人可以举例说明他们是如何模拟这种情况的?

无法模拟该类型,您只能模拟接口的实现。在您的情况下,我假设您正在尝试调用,并在响应中获取您构建的值。
为此,您需要创建一个类似

键入MockEC2API结构{
ec2iface.EC2API//需要嵌入接口来跳过所有方法的实现
DescribeVolumesMethod func(*ec2.DescribeVolumesInput)(*ec2.DescribeVolumesOutput,错误)
}
func(m*MockEC2API)descripebolumes(在*ec2.descripebolumesinput中)(*ec2.descripebolumesoutput,错误){
如果m.DescribeVolumesMethod!=零{
返回m.DescribeVolumesMethod(英寸)
}
return nil,nil//返回您认为对您有利的任何值
}
在测试中,创建
MockEC2API
的实例,而不是实际的
ec2.ec2
,并为其提供将被调用的函数,并返回您准备好的
ec2.DescribeVolumesOutput
结果

。。。
ec2:=&MockEC2API{
DescribeVolumesMethod:func(*ec2.DescribeVolumesInput)(*ec2.DescribeVolumesOutput,错误){
return&ec2.descripbeVolumeSoutput{…您的初始化…},nil
}
}
...
输出,err:=ec2.DescribeVolumes(in)//此输出将是您准备好的初始化

您能详细说明您正在调用的方法吗