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?
davy.ai
Sí, en la implementación del método
httpMock.get
, debes crear una nueva instancia demockedSuccessResponse
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 objetomockedSuccessResponse
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: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: