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.

Estableciendo un punto de interrupción específico de una solicitud de API dentro de una función

¿Cómo puedo implementar de forma individual stubs a funciones invocadas dentro de una función principal?

Supongamos que tengo estas funciones (req1, req2…) que son solicitudes HTTP a servicios externos que devuelven valores diferentes, ¿existe alguna manera en la que pueda aplicar stubs a req1 o req2 individualmente para simular sus valores?

El propósito de esto es porque necesito hacer esto para probar una función que depende de una verificación OTP y quiero evitar dicha verificación para cubrir todas las ramas en mis pruebas.

import request from 'request-promise';
const request1 = async (data) => return request({uri: "service1.com/get", method: "GET"});

const apiRequests = async (data) => {
   const req1 = await request1(data); // Quiero simular este valor como falso
   const req2 = await request2(data); // Quiero simular este valor como verdadero

   if (req1 && req2) {
      const req3 = await request3(data);
      const req4 = await request4(data);
      return "Segunda respuesta";
   }
   return "Primera respuesta";
}

Siempre me he sentido abrumado cuando intento comprender los niveles más profundos del mocking y la mayoría de los ejemplos que veo en línea no son tan anidados como el problema que estoy enfrentando, por lo que estoy un poco desconcertado acerca de cómo proceder.

También trabajo en un entorno bastante estricto, por lo que no se me permite utilizar ninguna otra biblioteca/paquete fuera de las bibliotecas de prueba incorporadas de Loopback.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para implementar individualmente stubs a funciones invocadas dentro de una función principal, puedes utilizar la biblioteca sinon para crear stubs de cada función que necesite ser simulada.

    Primero, instala sinon utilizando el siguiente comando:

    npm install sinon --save-dev
    

    Luego, modifica tu código para incluir la biblioteca sinon y crear stubs para las funciones request1 y request2.

    import sinon from 'sinon';
    import request from 'request-promise';
    
    const request1 = async (data) => request({ uri: "service1.com/get", method: "GET" });
    const request2 = async (data) => request({ uri: "service2.com/get", method: "GET" });
    const request3 = async (data) => request({ uri: "service3.com/get", method: "GET" });
    const request4 = async (data) => request({ uri: "service4.com/get", method: "GET" });
    
    const apiRequests = async (data) => {
        const req1Stub = sinon.stub().resolves(false);
        const req2Stub = sinon.stub().resolves(true);
    
        const req1 = await req1Stub();
        const req2 = await req2Stub();
    
        if (req1 && req2) {
            const req3 = await request3(data);
            const req4 = await request4(data);
    
            return "Segundo retorno";
        }
    
        return "Primer retorno";
    };
    

    En el código modificado anteriormente, hemos importado sinon y utilizado el método stub para crear nuevas funciones simuladas (stubs) para request1 y request2. También hemos creado funciones simuladas (stubs) para request3 y request4, pero no son necesarias para este ejemplo.

    Con las funciones simuladas (stubs) creadas, ahora podemos llamarlas en lugar de las funciones originales al probar apiRequests.

    Al llamar a req1Stub() obtenemos el valor false, que simula una solicitud HTTP fallida para request1. Hacemos lo mismo con req2Stub() y obtenemos el valor true, que simula una solicitud HTTP exitosa para request2.

    De esta manera, puedes implementar individualmente stubs a funciones invocadas dentro de una función principal y simular sus valores con fines de prueba.

Comments are closed.