es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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(&params)
    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.

Tags:  , , , ,

Answer

  1. Avatar for 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 argumento svc en la función PublishNotification con tu servicio simulado durante las pruebas.

    Aquí tienes un ejemplo de cómo puedes crear un servicio simulado:

    type mockSNS struct{}
    
    func (m *mockSNS) Publish(input *sns.PublishInput) (*sns.PublishOutput, error) {
        // No hacer nada en la función simulada
        return &sns.PublishOutput{}, nil
    }
    

    En la función PublishNotification, puedes actualizar el argumento svc para que sea una interfaz que represente la estructura sns.SNS, de esta manera:

    func PublishNotification(svc sns.SNSAPI, message string, target string) error {
        // ...
    }
    

    Luego, en tu función de prueba, puedes crear una instancia del servicio simulado y pasarla como argumento svc:

    func TestLabmdaWithSns(t *testing.T) {
        tests := []struct {
            request events.APIGatewayProxyRequest
        }{
            request: events.APIGatewayProxyRequest{Body:"algo"}
        }
    
        mockSvc := &mockSNS{} // Crear instancia del servicio simulado
    
        for _, test := range tests {
            response, err := Handler(test.request)
    
            // Actualizar la función PublishNotification para usar el servicio simulado
            err = PublishNotification(mockSvc, msg, target)
    
            // asertar algo
        }
    }
    

    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.

Comments are closed.