Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

123
Views
La función global Jest SpyOn no llama a la función original

Espero que alguien pueda ayudarme a comprender la interactividad de los prototipos js y jest.spOn() .

Tengo un pequeño ejemplo: una clase de ejemplo en el archivo TestObj.ts :

 export default class TestObj { foo() { // Do Something eg console.log("Hello World!"); } }

El siguiente caso de prueba de ejemplo tiene éxito, pero el console.log nunca se ejecuta.

 import TestObj from './TestObj'; const spyObj = jest.spyOn(TestObj.prototype, 'foo'); test('debug test', () => { const obj = new TestObj(); obj.foo(); expect(spyObj).toHaveBeenCalled(); });

Si cambio el caso de prueba de ejemplo a lo siguiente, la prueba tiene éxito y la instrucción console.log se llama como se esperaba.

 import TestObj from './TestObj'; test('debug test', () => { const spyObj = jest.spyOn(TestObj.prototype, 'foo'); const obj = new TestObj(); obj.foo(); expect(spyObj).toHaveBeenCalled(); });

¿Alguna idea de por qué la versión que usa la variable spyOn global no funciona como se esperaba?


Editar:

Parece no estar relacionado con los prototipos. El mismo Problema está ahí para una función sin ningún tipo de clase, editando el fragmento del Primer Código ( TestObj.ts ) a esto:

 export foo() { // Do Something eg console.log("Hello World!"); };

Recibimos el mismo problema para el segundo recorte actualizado. (La prueba tiene éxito, pero nunca se alcanza el registro de la consola).

 import * as testlib from './TestObj'; const spyObj = jest.spyOn(testlib, 'foo'); test('debug test', () => { testlib.foo(); expect(spyObj).toHaveBeenCalled(); });

Sin embargo, si actualizamos el segundo fragmento a lo siguiente, la prueba tiene éxito y se ejecuta el registro de la consola:

 import * as testlib from './TestObj'; const spyObj: jest.SpyInstance; beforeEach(() => { spyObj = jest.spyOn(testlib, 'foo'); }); test('debug test', () => { testlib.foo(); expect(spyObj).toHaveBeenCalled(); });

Sin embargo, todavía no tengo idea de por qué descubro este problema.

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

quien alguna vez se encuentra con esta publicación,

Explicación del problema

Investigué mucho más (prueba y error, mdn, página de manual de broma y muchos artículos medianos) y creo que descubrí el motivo del comportamiento extraño. Para entender este tema es importante conocer una serie de puntos:

  • 1: Los prototipos JS son variables globales, en las que se basa cada objeto del tipo correspondiente.
  • 2: Jest no restablece las variables globales después de cada prueba, los cambios realizados antes o dentro de cualquier prueba a una variable global se mantendrán para todo el conjunto de pruebas (archivo).
  • 3: La función de espionaje de broma es en realidad una maqueta de la función especificada con una implementación que llama a la función. por ejemplo: jest.SpyOn(TestObj.prototype, 'foo'); en realidad se implementa como: TestObj.prototype.foo = new jest.fn().mockImplementation(()=>{original_TestObj.prototype.foo()}); Esto significa que espiar una función de un prototipo de clase en realidad está cambiando una variable global.
  • 4: Dependiendo de su configuración de broma, existe la posibilidad de restablecer las funciones de maqueta antes de cada prueba al valor predeterminado. Pero tenga cuidado, la función predeterminada para spyOn parece ser la misma que para jest.fn() , una implementación vacía, lo que significa que aún se puede llamar a la maqueta pero no se ejecuta ningún código, especialmente la implementación original.

Solución

  • evite cambiar las variables globales, si desea que sus casos de prueba sean independientes entre sí.
  • evite espiar prototipos, en casos de prueba, si requiere el espionaje solo en una sola prueba, intente espiar el objeto local, por ejemplo:
 test('should foo', () => { const testObj = new TestObj(); const spyOnFn = jest.spyOn(testObj, 'foo'); // Do anything expect(spyOnFn).to//Have been anything });
  • si requiere implementaciones de spyOn de la misma función en más de una prueba, intente crear una variable global para la prueba, pero use antes de cada funcionalidad de broma para configurar el espía. Esta funcionalidad se ejecuta después del reinicio de todos los simulacros (si está habilitado). p.ej:
 let spyOnFunction1: jest.SpyInstance; beforeEach(()=> { spyOnFunction1 = jest.spyOn(TestObj.prototype, 'foo'); });
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!