El objetivo de los mocks es reemplazar algo que no controlamos por algo que sí, por lo que es importante que lo reemplacemos tenga todas las funciones que necesitamos.

La función de simulación proporciona características para:

La forma más sencilla de crear una instancia de función simulada es con jest.fn().

Con esto y Jest Expect, es fácil probar las llamadas capturadas:

test("Retorna undefined por defecto", () => {
  const mock = jest.fn();

  let result = mock("foo");

  expect(result).toBeUndefined();
  expect(mock).toHaveBeenCalled();
  expect(mock).toHaveBeenCalledTimes(1);
  expect(mock).toHaveBeenCalledWith("foo");
});

Y podemos cambiar el valor que nos regresa, la implementación o la respuesta de la promesa.

test("implementación del mock", () => {
  const mock = jest.fn(() => "bar");

  expect(mock("foo")).toBe("bar");
  expect(mock).toHaveBeenCalledWith("foo");
});

test("Otra implementación con mock", () => {
  const mock = jest.fn().mockImplementation(() => "bar");

  expect(mock("foo")).toBe("bar");
  expect(mock).toHaveBeenCalledWith("foo");
});

test("Cambiar la implementación una sóla vez", () => {
  const mock = jest.fn().mockImplementationOnce(() => "bar");

  expect(mock("foo")).toBe("bar");
  expect(mock).toHaveBeenCalledWith("foo");

  expect(mock("baz")).toBe(undefined);
  expect(mock).toHaveBeenCalledWith("baz");
});

test("Cambiar el valor de retorno", () => {
  const mock = jest.fn();
  mock.mockReturnValue("bar");

  expect(mock("foo")).toBe("bar");
  expect(mock).toHaveBeenCalledWith("foo");
});

test("Cambiar el valor de respuesta de la promesa", () => {
  const mock = jest.fn();
  mock.mockResolvedValue("bar");

  expect(mock("foo")).resolves.toBe("bar");
  expect(mock).toHaveBeenCalledWith("foo");
});

Inyección de dependencias

Una de las formas habituales de utilizar la función Mock es pasándola directamente como argumento de la función que se está probando. Esto nos permite ejecutar nuestra prueba, luego afirmar cómo se llamó al esta función y con qué argumentos:

const doAdd = (a, b, callback) => {
  callback(a + b);
};

test("calls callback with arguments added", () => {
  const mockCallback = jest.fn();
  doAdd(1, 2, mockCallback);
  expect(mockCallback).toHaveBeenCalledWith(3);
});

Mock modulos y funciones

Hay tres tipos principales de mocks de módulos y funciones en Jest: