我有一个导入:
import {
"github.com/aws/aws-sdk-go/service/route53"
}
然后我将其用于AWS Route 53中的主机区域。 我看到我创建的代码现在可以使用当前设置正常工作。
为了简化开发过程,我想创建一个模拟我在开发时使用的库方法。
我在配置中有一个键,例如env="development"
或env="production"
。
我的计划是使用所需的方法添加我自己的route53
对象,并在env开发时导入它。
我该如何做得更好? golang是否支持条件导入,如下所示:
if (env=="development") {
import "./route53-mock"
} else {
"github.com/aws/aws-sdk-go/service/route53"
}
答案 0 :(得分:3)
Go不支持条件导入 - 至少不支持当前的稳定版本。
使用您需要使用的方法的interface
非常适合解决此问题:
type TrafficPolicyLister interface {
ListTrafficPolicies(*route53.ListTrafficPoliciesInput) (*route53.ListTrafficPoliciesOutput, error)
}
现在,您可以在以前使用route53.Route53
的任何地方使用该界面。在生产中,您将传递类型为route53.Route53
的对象(实现该接口)但在开发期间您可以传递模拟:
type TrafficPolicyListerMock struct {}
func (t *TrafficPolicyListerMock) ListTrafficPolicies(input *route53.ListTrafficPoliciesInput) (*route53.ListTrafficPoliciesOutput, error) {
// return whatever you want your mock to return
}
答案 1 :(得分:1)
如果您想进行单元测试,请阅读answer of @csm。
如果你想拥有一个开发环境(而不是单元测试),你应该看看minio,实际上是一个自托管的S3实现。您应该使用环境变量来注入S3端点。然后您可以自由地使用自己的minio服务器进行开发。
答案 2 :(得分:-1)
" golang是否支持条件导入[?]"。答:不。只需看一下语言规范。
"我该如何做得更好?"答案:通过你自己的包路由到route53的路由,这个包在mock和real route53之间切换,具体取决于你的环境/ build -tags / cmdlineargs / whatever。