Cómo restablecer el recuento de llamadas de las funciones de simulación de Jest antes de cada prueba

81

Soy nuevo en Jest, estoy tratando de usarlo para probar si se llamó a una función o no. Noté que mock.calls.length no se restablece para cada prueba, sino que se acumula. ¿Cómo puedo convertirlo en 0 antes de cada prueba? No quiero que mis próximas pruebas dependan de los resultados de las anteriores.

Sé que hay beforeEach en Jest, ¿debería usarlo? ¿Cuál es la mejor manera de restablecer mock.calls.length? Gracias.

Un ejemplo de código:

Sum.js:

import local from 'api/local';

export default {
  addNumbers(a, b) {
    if (a + b <= 10) {
      local.getData();
    }
    return a + b;
  },
};

Sum.test.js

import sum from 'api/sum';
import local from 'api/local';
jest.mock('api/local');

// For current implementation, there is a difference 
// if I put test 1 before test 2. I want it to be no difference

// test 1
test('should not to call local if sum is more than 10', () => {
  expect(sum.addNumbers(5, 10)).toBe(15);
  expect(local.getData.mock.calls.length).toBe(0);
});

// test 2
test('should call local if sum <= 10', () => {
  expect(sum.addNumbers(1, 4)).toBe(5);
  expect(local.getData.mock.calls.length).toBe(1);
});
Alex Efremov
fuente

Respuestas:

130

Una forma que encontré para manejarlo: borrar la función simulada después de cada prueba:

Para agregar a Sum.test.js:

afterEach(() => {
  local.getData.mockClear();
});

Si desea borrar todas las funciones simuladas después de cada prueba, use clearAllMocks

afterEach(() => {
  jest.clearAllMocks();
});
Alex Efremov
fuente
Curioso si hay una manera de hacerlo para todos los métodos del objeto simulado. Cuando lo intento local.mockClear(), no funciona.
ciudadano conn
27
¿Has intentado usar jest.clearAllMocks()? Documentos: jestjs.io/docs/en/jest-object#jestclearallmocks
Alex Efremov
@AlexEfremov, ¡Muchas gracias por la jest.clearAllMocks()función! He estado usando mockClear()para jest.mockclases y aparentemente las simulaciones no se borraron por completo de alguna manera (las llamadas a funciones espías dentro de las clases simuladas no se borraron). Esto dio lugar a errores de diferencia instancia de objeto muy molestos: Compared values have no visual difference..
Patrick
20

Como señaló @AlexEfremov en los comentarios. Es posible que desee utilizar clearAllMocksdespués de cada prueba:

afterEach(() => {
    jest.clearAllMocks();
});

Tenga en cuenta que esto borrará el recuento de llamadas de todas las funciones simuladas que tenga, pero probablemente sea la forma correcta.

Daniel Marín
fuente
8

Puede configurar Jest para restablecer los simulacros después de cada prueba colocando esto en su jest.config.js:

module.exports = {
  resetMocks: true,
};

Aquí está la documentación para este parámetro de configuración: https://jestjs.io/docs/en/configuration#resetmocks-boolean

resetMocks [booleano]

Predeterminado: falso

Restablece automáticamente el estado simulado antes de cada prueba. Equivalente a llamar a jest.resetAllMocks () antes de cada prueba. Esto conducirá a que se eliminen las implementaciones falsas de cualquier simulacro, pero no restaurará su implementación inicial.

Andrey Vetlugin
fuente
3
¡Gracias! ¿Por qué esta no es una configuración predeterminada realmente me confunde ...?
aleatorio o