Golang 如何在 lambda 集成测试或单元测试中模拟 aws sns
Golang how to mock aws sns in a lambda integration test or unit test
我想在本地测试 lambda 函数调用,而不是使用 aws sns 服务。
func Handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error){
...do some logic and db opeations.
err := db.Create(something)
if err != nil {
msg := "something error."
target := "sns:arn"
// do sns notification
sess := session.Must(session.NewSession())
svc := sns.New(sess,&cfg)
err = PublishNotification(svc, msg, target)
}}
func PublishNotification(svc *sns.SNS, message string, target string) error {
params := sns.PublishInput{
Message: &message,
Subject: &subject,
TargetArn: &target,
}
req, _ := svc.PublishRequest(¶ms)
err := req.Send()
if err != nil {
return err
}
return nil
}
func main(){
lambda.Start(Handler)
}
现在一切正常。我想对这个 lambda 处理程序进行单元测试或集成测试。
func TestLabmdaWithSns(t *testing.T) {
tests := []struct {
request events.APIGatewayProxyRequest
}{
request: events.APIGatewayProxyRequest{Body:"something"}
}
for _, test := range tests {
response, err := Handler(test.request)
// assert something
}
}
并且我不想在测试时发送 sns 通知。
我应该如何模拟此 svc 或 PublishNotification 函数以在本地测试时不向 sns 发布消息?
谢谢
您应该在 PublishNotification 中使用接口 snsiface.SNSAPI 而不是 *sns.SNS。然后你可以将 snsiface.SNSAPI 的模拟实现注入到单元测试中,如下所述:https://docs.aws.amazon.com/sdk-for-go/api/service/sns/snsiface/
我想在本地测试 lambda 函数调用,而不是使用 aws sns 服务。
func Handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error){
...do some logic and db opeations.
err := db.Create(something)
if err != nil {
msg := "something error."
target := "sns:arn"
// do sns notification
sess := session.Must(session.NewSession())
svc := sns.New(sess,&cfg)
err = PublishNotification(svc, msg, target)
}}
func PublishNotification(svc *sns.SNS, message string, target string) error {
params := sns.PublishInput{
Message: &message,
Subject: &subject,
TargetArn: &target,
}
req, _ := svc.PublishRequest(¶ms)
err := req.Send()
if err != nil {
return err
}
return nil
}
func main(){
lambda.Start(Handler)
}
现在一切正常。我想对这个 lambda 处理程序进行单元测试或集成测试。
func TestLabmdaWithSns(t *testing.T) {
tests := []struct {
request events.APIGatewayProxyRequest
}{
request: events.APIGatewayProxyRequest{Body:"something"}
}
for _, test := range tests {
response, err := Handler(test.request)
// assert something
}
}
并且我不想在测试时发送 sns 通知。
我应该如何模拟此 svc 或 PublishNotification 函数以在本地测试时不向 sns 发布消息?
谢谢
您应该在 PublishNotification 中使用接口 snsiface.SNSAPI 而不是 *sns.SNS。然后你可以将 snsiface.SNSAPI 的模拟实现注入到单元测试中,如下所述:https://docs.aws.amazon.com/sdk-for-go/api/service/sns/snsiface/