DEV Community

Vitor Rios
Vitor Rios

Posted on

Mockando Constantes em Testes com Jest: Um Exemplo Prático

Ao trabalhar com constantes em seus projetos, às vezes é necessário alterar seus valores para testar diferentes cenários. Porém, constantes importadas diretamente não podem ser sobrescritas facilmente, o que pode dificultar a criação de testes. Neste artigo, veremos como usar o Jest para mockar constantes de forma dinâmica, garantindo testes isolados e confiáveis.

Vamos criar um exemplo fictício chamado adjustImageQuality, onde ajustamos a qualidade de uma imagem dependendo se estamos em um ambiente de produção.


Implementação

Arquivo constants.js

Definimos uma constante chamada IS_PRODUCTION que indica se estamos em um ambiente de produção:

// constants.js
export const IS_PRODUCTION = false;
Enter fullscreen mode Exit fullscreen mode

Arquivo adjustImageQuality.js

Agora, criamos a função adjustImageQuality. Ela altera a qualidade da imagem apenas se o sistema estiver em produção:

// adjustImageQuality.js
import { IS_PRODUCTION } from "./constants";

export default function adjustImageQuality(img) {
  if (IS_PRODUCTION) {
    img.quality = 100; // Qualidade máxima em produção
  } else {
    img.quality = 50; // Qualidade reduzida em desenvolvimento
  }

  return img;
}
Enter fullscreen mode Exit fullscreen mode

Escrevendo os Testes

Queremos testar o comportamento de adjustImageQuality para os dois cenários: produção (IS_PRODUCTION = true) e desenvolvimento (IS_PRODUCTION = false).

Arquivo adjustImageQuality.test.js

Utilizamos o Jest para mockar o valor de IS_PRODUCTION dinamicamente. O segredo é usar jest.mock e sobrescrever a constante com um getter personalizado.

// adjustImageQuality.test.js
import adjustImageQuality from "./adjustImageQuality";

// Mock para a constante IS_PRODUCTION
const mockIsProduction = jest.fn();

jest.mock("./constants", () => {
  const constants = jest.requireActual("./constants");
  return {
    ...constants,
    get IS_PRODUCTION() {
      return mockIsProduction();
    },
  };
});

beforeEach(() => {
  mockIsProduction.mockClear(); // Limpa os mocks antes de cada teste
});

test("sets image quality to 100 in production", () => {
  // Configura o mock para retornar true (produção)
  mockIsProduction.mockReturnValue(true);

  const img = { quality: 0 };

  const result = adjustImageQuality(img);

  expect(result.quality).toEqual(100);
});

test("sets image quality to 50 in development", () => {
  // Configura o mock para retornar false (desenvolvimento)
  mockIsProduction.mockReturnValue(false);

  const img = { quality: 0 };

  const result = adjustImageQuality(img);

  expect(result.quality).toEqual(50);
});
Enter fullscreen mode Exit fullscreen mode

Explicação do Mock

1. Criando o Mock

Utilizamos o jest.mock para interceptar o módulo constants. Dentro dele, usamos o jest.requireActual para obter as exportações reais e adicionamos um getter para a constante IS_PRODUCTION.

jest.mock("./constants", () => {
  const constants = jest.requireActual("./constants");
  return {
    ...constants,
    get IS_PRODUCTION() {
      return mockIsProduction();
    },
  };
});
Enter fullscreen mode Exit fullscreen mode

2. Mockando o Valor de IS_PRODUCTION

Dentro de cada teste, usamos mockReturnValue para simular diferentes valores para IS_PRODUCTION:

  • mockIsProduction.mockReturnValue(true) para produção.
  • mockIsProduction.mockReturnValue(false) para desenvolvimento.

3. Limpeza com mockClear

Antes de cada teste, limpamos o estado do mock para garantir que ele não interfira nos outros testes:

beforeEach(() => {
  mockIsProduction.mockClear();
});
Enter fullscreen mode Exit fullscreen mode

Conclusão

Este padrão de mock para constantes permite que você controle dinamicamente valores usados na lógica de sua aplicação, garantindo testes isolados e confiáveis. Ele é especialmente útil quando você precisa testar comportamentos baseados em variáveis globais, configurações ou estados do sistema.

Com essa abordagem, você consegue cobrir cenários complexos sem comprometer a estrutura do seu código ou adicionar dependências externas desnecessárias.

Top comments (0)