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.

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read full post →

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up