Tengo un espía que se usa en múltiples aserciones a través de múltiples pruebas en una suite.
¿Cómo borro o reseteo el espía para que en cada prueba se considere que no se ha invocado el método que intercepta el espía?
Por ejemplo, ¿cómo hacer que la afirmación en 'does not run method' sea verdadera?
const methods = { run: () => {} } const spy = jest.spyOn(methods, 'run') describe('spy', () => { it('runs method', () => { methods.run() expect(spy).toHaveBeenCalled() //=> true }) it('does not run method', () => { // how to make this true? expect(spy).not.toHaveBeenCalled() //=> false }) })Gracias a @sdgluck por la respuesta, aunque me gustaría agregar a esta respuesta que, en mi caso, quería un estado claro después de cada prueba, ya que tengo varias pruebas con el mismo espía. Entonces, en lugar de llamar a mockClear() en las pruebas anteriores, lo moví a afterEach() (o puede usarlo con beforeEach ) así:
afterEach(() => { jest.clearAllMocks(); });Y finalmente, mis pruebas funcionan como deberían sin que se llame al espía de la prueba anterior. También puede leer su documentación para ello.
Si desea hacerlo desde un nivel global, también puede actualizar su jest.config.js (o desde package.json )
module.exports = { clearMocks: true, // ... }Puedes leer la documentación de Jest al respecto.
Los espías de broma tienen la misma API que los simulacros. La documentación para simulacros está aquí y especifica un método mockClear que:
Restablece toda la información almacenada en las matrices
mockFn.mock.callsymockFn.mock.instances.A menudo, esto es útil cuando desea limpiar los datos de uso de un simulacro entre dos afirmaciones .
(énfasis mío)
Entonces podemos usar mockClear para "restablecer" un espía. Usando tu ejemplo:
const methods = { run: () => {} } const spy = jest.spyOn(methods, 'run') describe('spy', () => { it('runs method', () => { methods.run() expect(spy).toHaveBeenCalled() //=> true /* clean up the spy so future assertions are unaffected by invocations of the method in this test */ spy.mockClear() }) it('does not run method', () => { expect(spy).not.toHaveBeenCalled() //=> true }) })En caso de que desee restaurar el comportamiento original de un método que había agregado previamente a un espía, puede usar el método mockRestore.
Mira el ejemplo a continuación:
class MyClass { get myBooleanMethod(): boolean { return true; } } const myObject = new MyClass(); const mockMyBooleanMethod = jest.spyOn(myObject, 'myBooleanMethod', 'get'); // mock myBooleanMethod to return false mockMyBooleanMethod.mockReturnValue(false); // restore myBooleanMethod to its original behavior mockMyBooleanMethod.mockRestore();