Estoy tratando de descubrir cómo simular correctamente este código. Descubrí cómo simular un éxito, pero no puedo descifrar cómo simular el bloque de captura/rechazo.
Código de la aplicación:
function getData(url = '') { return new Promise((resolve, reject) => { axios .get(`${baseURL}${url}`) .then((res) => { resolve(res.data); }) .catch((err) => { reject(err); }); }); }en las pruebas tengo:
import axios from 'axios'; const MockAdapter = require('axios-moc-adapter'); describe('getData', () => { it('test success', async () => { const mock = new MockAdapter(axios); mock.onGet(`${service.baseURL}/sites`).reply(200, 'success'); const axiosSpy = jest.spyOn(axios, 'get'); const rtn = await service.getData('/sites'); expect(axiosSpy).toHaveBeenCalled(); expect(rtn).toBe('success'); }); it('test failure', async () => { const mock = new MockAdapter(axios); mock.onGet(`${service.baseURL}/sites`).networkError(); const rtn = await service.getData('/sites').catch((err) => { expect(err.message).toBe('message'); }); expect(rtn).toBe(undefined); }); });La prueba de éxito de la prueba funciona, pero cuando pruebo la falla, obtengo:
Expected: "message" Received: "Cannot read properties of undefined (reading 'then')" 29 | mock.onGet(`${service.baseURL}/sites`).networkError(); 30 | const rtn = await service.getData('/sites').catch((err) => { > 31 | expect(err.message).toBe('message'); | ^ 32 | }); 33 | expect(rtn).toBe(undefined); 34 | });¿Cómo puedo escribir una prueba que pase con éxito el caso de falla? Específicamente, puedo hacer que esta prueba pase sin verificar dentro del bloque catch, pero cuando ejecuto la cobertura, no cubre el bloque catch en el código de la aplicación. ¿Cómo puedo cubrir correctamente esta línea?
No se puede reproducir su problema, pero .networkError() generará un mensaje de error con el mensaje 'Network Error' en lugar de 'message' , consulte el código fuente index.js#L141
service.ts :
import axios from 'axios'; export const baseURL = 'http://localhost:3000/api'; export function getData(url = '') { return new Promise((resolve, reject) => { axios .get(`${baseURL}${url}`) .then((res) => { resolve(res.data); }) .catch((err) => { reject(err); }); }); } service.test.ts :
import * as service from './service'; import axios from 'axios'; import MockAdapter from 'axios-mock-adapter'; describe('getData', () => { it('test success', async () => { const mock = new MockAdapter(axios); mock.onGet(`${service.baseURL}/sites`).reply(200, 'success'); const axiosSpy = jest.spyOn(axios, 'get'); const rtn = await service.getData('/sites'); expect(axiosSpy).toHaveBeenCalled(); expect(rtn).toBe('success'); }); it('test failure', async () => { const mock = new MockAdapter(axios); mock.onGet(`${service.baseURL}/sites`).networkError(); const rtn = await service.getData('/sites').catch((err) => { expect(err.message).toBe('Network Error'); }); expect(rtn).toBe(undefined); }); it('test failure 2', async () => { const mock = new MockAdapter(axios); mock.onGet(`${service.baseURL}/sites`).networkError(); await expect(service.getData('/sites')).rejects.toThrowError('Network Error'); }); });resultado de la prueba:
PASS examples/69947398/service.test.ts (8.89 s) getData ✓ test success (5 ms) ✓ test failure (1 ms) ✓ test failure 2 (2 ms) ------------|---------|----------|---------|---------|------------------- File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ------------|---------|----------|---------|---------|------------------- All files | 100 | 0 | 100 | 100 | service.ts | 100 | 0 | 100 | 100 | 4 ------------|---------|----------|---------|---------|------------------- Test Suites: 1 passed, 1 total Tests: 3 passed, 3 total Snapshots: 0 total Time: 9.52 s