Cómo simular aws sns en una prueba de integración o prueba unitaria de lambda en Golang
Quiero probar localmente la llamada a la función lambda y no usar el servicio AWS SNS.
func Handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error){
...haz alguna lógica y operaciones en la base de datos.
err := db.Create(something)
if err != nil {
msg := "error en algo."
target := "sns:arn"
// realizar notificación de sns
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)
}
Ahora todo funciona bien. Y quiero realizar pruebas unitarias o de integración en este controlador de lambda.
func TestLambdaWithSNS(t *testing.T) {
tests := []struct {
request events.APIGatewayProxyRequest
}{
request: events.APIGatewayProxyRequest{Body: "algo"},
}
for _, test := range tests {
response, err := Handler(test.request)
// hacer alguna afirmación
}
}
Y no quiero enviar notificaciones de SNS al realizar las pruebas.
¿Cómo debo simular este svc o la función PublishNotification para no enviar el mensaje a SNS al probar localmente?
Gracias.
davy.ai
Para simular el servicio de SNS y evitar que el mensaje sea publicado al probar localmente, puedes crear un servicio simulado que implemente la misma interfaz que la estructura
sns.SNS
que se utiliza para publicar el mensaje. Luego, puedes reemplazar el argumentosvc
en la funciónPublishNotification
con tu servicio simulado durante las pruebas.Aquí tienes un ejemplo de cómo puedes crear un servicio simulado:
En la función
PublishNotification
, puedes actualizar el argumentosvc
para que sea una interfaz que represente la estructurasns.SNS
, de esta manera:Luego, en tu función de prueba, puedes crear una instancia del servicio simulado y pasarla como argumento
svc
:Al reemplazar el argumento
svc
con un servicio simulado durante las pruebas, el código que publica el mensaje en SNS no se ejecutará, lo que te permitirá probar el resto de la lógica en tu código.