Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

277
Visualizações
JestJs: Múltiples llamadas de API asíncronas a Axios obtienen una implementación simulada que da la misma respuesta

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

 const productIds = [ "SKU-1", "SKU-2" ]; const promises = productIds.map<Promise<Product>>(id => axios.get(`/products/${id}`)); Promise.all(promises).then(values => { // do some stuff here. });

El caso de prueba de unidad escrito utiliza la implementación simulada de broma como se muestra a continuación.

 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("Update operations!", () => { beforeAll(() => { httpMock.get.mockImplementation(url => { // Call to Get product. 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); }; }); }); });

Jest devuelve la respuesta de la última llamada API, es decir, la respuesta de SKU-2 incluso para el producto con id SKU-1 . ¿Me estoy perdiendo de algo?

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Dado que está modificando la misma referencia de objeto ( mockedSuccessResponse.data ), los cambios posteriores sobrescribirán los anteriores. Esto significa que el objeto simulado ( sku2 ) para la url que termina con /SKU-2 anulará el mockedSuccessResponse.data . Cuando llamas a axios.get() en promise.all , ambos resolvieron los datos simulados de sku2 .

Solución: Cree diferentes objetos simulados para diferentes ramas condicionales.

P.ej

index.ts :

 import axios from 'axios'; interface Product { id: string; } export function main() { const productIds = ['SKU-1', 'SKU-2']; const promises = productIds.map<Promise<Product>>((id) => axios.get(`/products/${id}`)); return Promise.all(promises); }

index.test.ts :

 import http from 'axios'; import { main } from './'; jest.mock('axios', () => ({ create: jest.fn(() => http), get: jest.fn(), })); const httpMock = http as jest.Mocked<typeof http>; describe('Update operations!', () => { const sku1 = { id: 'sku-1' }; const sku2 = { id: 'sku-2' }; beforeAll(() => { httpMock.get.mockImplementation((url: string): any => { if (url.endsWith('/SKU-1')) { return Promise.resolve({ data: Object.assign({}, sku1) }); } if (url.endsWith('/SKU-2')) { return Promise.resolve({ data: Object.assign({}, sku2) }); } }); }); test('should pass', async () => { const actual = await main(); expect(actual).toEqual([{ data: { id: 'sku-1' } }, { data: { id: 'sku-2' } }]); }); });

Resultado de la prueba:

 PASS examples/70599956/index.test.ts (9.178 s) Update operations! ✓ should pass (2 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 9.216 s
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda