Tengo un problema en el que quiero cambiar lo que devuelve un método de clase para una sola prueba mientras pruebo un módulo diferente. tengo lo siguiente:
testingModule.prueba.js
const { testingModuleMethod } = require('../testingModule') jest.mock('../helperClass', () => jest.fn().mockImplementation(() => ({ helperClassMethod: jest.fn() })) ); describe('testingModule.js', () => { describe('testingModuleMethod', () => { describe('when errors', () => { const consoleSpy = jest.spyOn(console, 'error'); // SOMETHING NEEDS TO GO HERE TO CHANGE THE jest.mock ON LINE 3 await expect(testingModuleMethod(data)).rejects.toThrow('Error'); expect(consoleSpy).toHaveBeenCalled(); consoleSpy.mockRestore(); }); }); });testingModule.js
const HelperClass = require('./helperClass'); const testingModuleMethod = async (data, callback) => { try { const objectToEvaluate = data.object; const helperClassInstance = new HelperClass(); await helperClassInstance.helperClassMethod(objectToEvaluate); log('info', "Success!"); callback(null, {}); } catch(error) { log('error', 'Something went wrong') } };No importa lo que ponga allí, recibo un error con el código (indefinido) o simplemente lo ignora y se resuelve debido a la simulación al principio. Intenté agregar un espía, importar la clase y usar la anulación del prototipo.
Estoy usando nodo y "jest": "^27.0.6"
He logrado responder a esto haciendo lo siguiente:
En primer lugar, descubrí que para simular una clase como esa, tengo que agregar una función de broma en el simulacro de esta manera:
describe('testingModuleMethod', () => { describe('when errors', () => { const consoleSpy = jest.spyOn(console, 'error'); HelperClass.mockImplementation(() => ({ helperClassMethod: jest.fn(() => { throw new Error('Error') }) })); await expect(testingModuleMethod(data)).rejects.toThrow('Error'); expect(consoleSpy).toHaveBeenCalled(); consoleSpy.mockRestore(); }); });Sin embargo, esto también tuvo un efecto secundario en el resto de las pruebas, así que agregué un beforeEach al comienzo que se ve así:
HelperClass.mockImplementation( jest.fn().mockImplementation(() => ({ helperClassMethod: jest.fn() })) );Finalmente necesitaba requerir la clase. La prueba general se ve así ahora y funciona:
const { testingModuleMethod } = require('../testingModule'); const HelperClass = require('./helperClass'); jest.mock('../helperClass', () => jest.fn().mockImplementation(() => ({ helperClassMethod: jest.fn() })) ); describe('testingModule.js', () => { beforeEach(() => { HelperClass.mockImplementation( jest.fn().mockImplementation(() => ({ helperClassMethod: jest.fn() })) ); }); describe('testingModuleMethod', () => { describe('when errors', () => { const consoleSpy = jest.spyOn(console, 'error'); HelperClass.mockImplementation(() => ({ helperClassMethod: jest.fn(() => { throw new Error('Error') }) })); await expect(testingModuleMethod(data)).rejects.toThrow('Error'); expect(consoleSpy).toHaveBeenCalled(); consoleSpy.mockRestore(); }); }); });