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.

JestJs: Implementación de burla de múltiples llamadas asíncronas a la API mediante Axios devuelve la misma respuesta.

Tengo un método para obtener datos de productos de una API. Utilizo Axios para llamar a la API. Como los datos de los productos son independientes entre sí, llamo a todas las APIs a la vez y uso Promise.all para esperar a que las llamadas se completen antes de continuar. Por ejemplo, considera una función (no encerrada en una declaración de función) con las líneas siguientes.

const productIds = [ "SKU-1", "SKU-2" ];
const promises = productIds.map<Promise<Product>>(id => axios.get(/products/${id}));
Promise.all(promises).then(values => {
// hacer algo aquí.
});

El caso de prueba unitario utiliza una implementación simulada de jest de la siguiente manera.
“`
import http from "axios";
import { sku1, sku2 } from "./test-product-data";
jest.mock("axios", () => ({
create: jest.fn(() => http),
get: jest.fn(() => Promise.resolve()),
}));
const httpMock = http as jest.Mocked<typeof http>;

describe("Operaciones de actualización!", () => {
beforeAll(() => {
httpMock.get.mockImplementation(url => {
// Llamada para obtener el producto.
if (url.endsWith("/SKU-1")) {
mockedSuccessResponse.data = Object.assign({}, sku1);
return Promise.resolve(mockedSuccessResponse);
};
if (url.endsWith("/SKU-2")) {
mockedSuccessResponse.data = Object.assign({}, sku2);
return Promise.resolve(mockedSuccessResponse);
};
});
});
});
<code>
Jest devuelve la respuesta de la última llamada a la API, es decir, la respuesta de</code>SKU-2<code>incluso para el producto con el id</code>SKU-1“`. ¿Me estoy perdiendo algo?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, en la implementación del método httpMock.get, debes crear una nueva instancia de mockedSuccessResponse para cada llamada a la API en lugar de reutilizar la misma instancia. Esto se debe a que la respuesta de cada producto debe ser independiente entre sí, pero actualmente estás actualizando el mismo objeto mockedSuccessResponse en cada bloque de condición.

    Para solucionar este problema, puedes crear una nueva instancia de mockedSuccessResponse al principio de cada bloque de condición, de la siguiente manera:

    if (url.endsWith("/SKU-1")) {
      const response = { data: Object.assign({}, sku1) };
      return Promise.resolve(response);
    }
    if (url.endsWith("/SKU-2")) {
      const response = { data: Object.assign({}, sku2) };
      return Promise.resolve(response);
    }
    

    Esto asegura que se cree un nuevo objeto de respuesta para cada llamada a la API y que sea independiente de los anteriores.

    Además, puedes simplificar el código eliminando por completo la variable mockedSuccessResponse y devolviendo un nuevo objeto de respuesta directamente, de la siguiente manera:

    if (url.endsWith("/SKU-1")) {
      return Promise.resolve({ data: Object.assign({}, sku1) });
    }
    if (url.endsWith("/SKU-2")) {
      return Promise.resolve({ data: Object.assign({}, sku2) });
    }
    

Comments are closed.