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);
});

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();
});

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.


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.


3
¡Gracias! ¿Por qué esta no es una configuración predeterminada realmente me confunde ...?
aleatorio o
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.