Estoy tratando de simular el valor de retorno de un método de una clase que se instancia dentro de la clase que estoy probando, sin que el valor simulado persista en el resto de las pruebas.
Aquí hay una demostración muy básica que he reunido:
Misterio.ts
export class Mystery { private max = 10; public getNumber(): number { return Math.random() * this.max; } }TestedClass.ts
import { Mystery } from './Mystery'; export class TestedClass { public someMethod() { const numberGenerator = new Mystery(); return numberGenerator.getNumber(); } }TestedClass.test.ts
import { Mystery } from './Mystery'; import { TestedClass } from './TestedClass'; jest.mock('./Mystery'); describe('TestedClass', () => { beforeEach(jest.clearAllMocks); it('should return the number 1000', () => { // I want to have Mystery.getNumber() return 1000 for this test only. Mystery.prototype.getNumber = jest.fn().mockReturnValue(1000); // jest.spyOn(Mystery.prototype, 'getNumber').mockReturnValue(1000); // Mystery.prototype.getNumber = jest.fn().mockReturnValueOnce(1000); const provider = new TestedClass(); const result = provider.someMethod(); expect(result).toEqual(1000); }); it('should return undefined', () => { const provider = new TestedClass(); const result = provider.someMethod(); // Expects: undefined, Received: 1000 expect(result).toEqual(undefined); }); }); Como puede ver en la prueba, veo que aparecen 1000 en la segunda prueba que me gustaría evitar. En el escenario real, es probable que todas las pruebas necesiten simular el valor de retorno de Mystery.getNumber() (de diferentes maneras), pero quiero asegurarme de que una prueba no afecte a otra prueba como podría ser ahora.
Este comportamiento actual tiene sentido ya que estoy cambiando Mystery.prototype , pero no estoy seguro de cómo simular el valor de la prueba individual de otra manera. También soy consciente del uso de la composición, lo que sería de gran ayuda aquí, pero me gustaría evitar esto por el bien de esta pregunta.
Si intenta simular el método getNumber solo para un único caso de prueba y no para todos los casos de prueba, el jest.fn().mockReturnValueOnce debería funcionar.
Entonces, en lugar de
Mystery.prototype.getNumber = jest.fn().mockReturnValue(1000);usar
Mystery.prototype.getNumber = jest.fn().mockReturnValueOnce(1000);