Estoy escribiendo pruebas unitarias para una función que llama a otra función dentro del mismo módulo.
P.ej.
export function add(a, b) { return a + b } export function showMessage(a, b) { let sum = add(a, b) return `The sum is ${sum}` }Prueba:
import * as Logics from './logics; describe('showMessage', () => { it('should return message with sum', () => { let addSpy = jest.spyOn(Logics, 'add') let showMessageResponse = Logics.showMessage(2, 2) expect(addSpy).toHaveBeenCalledTimes(1) }); });Quiero probar si se llama a la función de agregar cuando se ejecuta showMessage. El anterior está dando el siguiente error:
Número esperado de llamadas: 1 Número de llamadas recibidas: 0
Encontré una solución, pero eso requiere cambios en la forma en que se exportan las funciones:
function add(a, b) { return a + b } function showMessage(a, b) { const sum = Logics.add(a, b) return `The sum is ${sum}` } const Logics = { showMessage, add } export default LogicsNo quiero cambiar la forma en que exporto las funciones.
En resumen, realmente no puede lograrlo sin cambiar sus exportaciones en absoluto. Puede leer los motivos (y tal vez otras opciones en esta respuesta , así como en esta respuesta ).
En mi opinión, una mejor opción sería algo como (en su archivo logics.js):
import * as Logics from './logics; y en la función showMessage como lo hizo en su segundo ejemplo:
const sum = Logics.add(a, b) Básicamente, solo importa todo en su logics.js y usa ese valor para obtener la referencia a la misma función de add .
Explicación adicional: mientras se burla correctamente del add , pero esa no es la misma función que la llamada en showMessage y básicamente no puede burlarse de esa función (también puede verificar este código como prueba
describe("showMessage", () => { it("should return the mocked sum (PASSES)", () => { jest.spyOn(Logics, "add").mockReturnValue(123); const showMessageResponse = Logics.add(2, 2); expect(showMessageResponse).toBe(123); }); it("should return message with sum (FAILS)", () => { let addSpy = jest.spyOn(Logics, "add").mockReturnValue(123); const showMessageResponse = Logics.showMessage(2, 2); expect(addSpy).toHaveBeenCalledTimes(0); expect(showMessageResponse).toBe(`The sum is 123`); }); });) también publicado en este sandbox
Idealmente, debe probar la función independiente. Una prueba no es responsable de la funcionalidad de prueba de otra función.
No es el mejor enfoque, pero podrías hacer algo como esto:
util.js
export function add(a, b) { return a + b; } export function showMessage(a, b, addNew = add) { let sum = addNew(a, b); return `The sum is ${sum}`; } Y en tu prueba podrías hacer esto: util.test.js
import * as Logics from "./util"; describe("showMessage", () => { it("should return message with sum", () => { let addSpy = jest.spyOn(Logics, "add"); addSpy.mockReturnValue(123); let showMessageResponse = Logics.showMessage(2, 2, addSpy); expect(addSpy).toHaveBeenCalledTimes(1); expect(showMessageResponse).toBe(`The sum is 123`); }); });Aquí está la caja de arena con la que puedes jugar: https://codesandbox.io/s/jest-test-forked-9zk1s4?file=/util.test.js:0-366